linux第九天
shell脚本入门。
linux第九天
vim编辑器


在比较文件的时候可以按ctrl+w,左右方向键切换

在命令模式下:
大写I键快速到达开头并自动切换到插入模式
小写a会往后移一个格然后进入输入模式,A会到最后一行
小写o向下新建一行,大写O自然就向上新建一行
只读文件如果你是root,你可以强行存退出,普通就不行了.但是如果你又这个文件夹的读写权限,可以强行退出,也会不保存,但是这个过程其实不是真的写进去而是删除了文件再重新创建一个新的文件
在扩展模式下输入:r /etc/issue这样会在你所在的行写入这个文件


在我们在编辑文件的时候,如果想执行某些命令,可以使用!需要执行的命令,把命令执行结果写道当前行:r!需要执行的命令,这会在下一行引入,当然你得知道输入命令的特性,如果是比如说要让你接着输入口令的你也必须要这样做


数字0是跳到整个行首(有些开头是有空格的,0是真正跳到行首)
.隔开的才算句子


要替换单个字母,在交互模式下按r,然后输入你要替换的字母.要是按下R你就可以为所欲为的替换了

你可以用dG删除到行尾的,自然也可以用dgg删除到行首


在交互模式下按100然后再按下i进入输入模式,输入wang然后按下esc,这就复制了100次
整行变成大写:在交互模式下,按下0跳到行首,然后gU,然后$,那就整行改变了



当然你需要指定界限,1,100s/root/ROOT/,这样只替代第一个,必须1,100s/root/ROOT/g


这个是在交互模式下执行,比如需要把当前的这行复制到a这个寄存器:"ayy

选中后可以使用shitf+>实现向左向右




加行号,在末行模式:set number ,取消行号:set nonumber
希望和上一行对齐:set ai

重点关注设置光标所在标识线
如果你复制后的格式有很大的差别,可以set noai
shell编程初级

我们的shell就是通过解释器来执行的,在执行的时候运行这个解释器(各种shell)




你要允许,即时你在这个目录下,你直接输入这个脚本名称,会报名称没有找到,因为系统会看你是不是别名或者内部命令,然后看是不是外部(根据path变量去找),你当前的这个目录不再这个变量中,自然没有。所有你要执行得自己加上路径比如./hello.sh,当然如果你不喜欢加上路径那么你可以写道$PATH变量中的路径下。
接着解决路径问题你还得需要加上执行权限:chmod +x hello.sh

命令敲错不会影响下面的执行,但是也不是绝对的,如果有些特殊的语法是会导致无法执行的
定义变量,name=hehe不能有空格
变量赋值:name=$PATH
如果你不想用这个变量:unset name
shell表现为一个进程:bash。可以通过ps aux看看系统进程。pstree可以更加直观,bash这个程序会解释执行。我们可以直接使用bash bin/systeminfo.sh这样的用bash直接执行它。
echo $$显示当前的进程,echo $PPID父进程,父进程没了子进程也会没了,但是也有例外。这就是僵尸进程,还在占用内存,不可使用

set不仅可以看到变量也可以看到函数
如果我们 name=cat /etc/issue,这样也是可以的,但是你如果是echo $name会把所有的内容的换行取消变成同一行的。因此可以这样显示echo "$name"加个双引号
注意一点,普通变量是不能被继承,也就是说父的不能调用子的子的不能调用父的(进程),但是环境变量可以被子进程调用,可以使用pstree -p查看进程树

环境变量当然也可以先声明然后再声明为环境变量 name=10;export name
declare -x可以看到所有的环境变量,当然你也可以用expor,以及env
环境变量对所有的shell都有效

这里要关注的是SHLVL,这个变量是可以看到shell的嵌套深度,echo $_,这个变量存的就是上一个变量的最后一个参数,相当于!$,但是这个可以在脚本中调用

只读变量只能等你退出才能删除,unset是不行的
如果你写成这样 name=test;( echo $name;name=22; echo \$name )echo $name。它最后还是会显示test;因为当它赋值他就会开启一个子进程,比较特殊,但并不是一个独立子进程。同样的道理
( cd /etc/;pwd )它显示/etc,但是并没有进入这个目录,一样开启了个子进程。我们以后不希望影响当前状态可以使用这种情况
如果你需要输出10n。你应该:n=10;echo ${n}n,脚本也是如此
脚本变量,就如上图所以的说法,$与$@都可以表示所有参数,他们的差异就只是在于有没有加引号,举个例子,在有引号的情况下,把所有的参数都传递给第二个脚本,f2.sh “$*“,这样子传递,f2的第一个参数那就是所有参数了,第二个则为空,而$@则不会是这样的情况。
$#代表个数,
$0是命令本身,如果你像输出的是当前这个脚本可以加上basename \$*``.
set –清空所有位置参数
shift,可以将位置参数进行调整。当你脚本中出现shitf,那么第二个参数就变成第一个,后面的依次类推。出现一次就所有参数往前一次。如果你有4个参数。只能shift4次,第五次的时候$?将会输出非0.
可以自行修改.vimrc文件的配置来自定义vim编辑新文件的开头格式
小提示:可以使用以下命令复制文件到其他服务器(当然得知道密码的前提,这是复制到那个用户的根目录):scp install.log wang@172.18.1.124:。当然也可以复制到你自己的文件夹下:scp -r wang@172.18.1.124:/home/wang/script /app

比如我执行ls -al,查看状态echo $?返回0. ls s /eee/返回的不会是0.如果是在脚本中的话则是看最后一条命令的执行结果是否正确,但是返回结果是可以认为修改的,比如脚本的最后一条是exit 0那就返回的是0
grep -q root /etc/passwd 不关心具体找没找到

两个变量,let sum=$i+$j,然后echo $sum才能正确显示。也可以这样echo $[i+j],也可以echo $((i+j)),也可以expr 1 + 2,expr是一个命令(乘法*必须转义),因此中间是有空格的,也可以用bc。
声明一个int类型的:declare -i n=10
也支持++,–,+=这种写法 :let var++
随机颜色(带高亮闪烁)color=$[RANDOM%7+31];echo -e "\033[1;5;${color}mred color \033[0m"
另一种随机办法:取31-37的一位随机数赋给color变量 color=seq 31 37|sort -R|head -1;
给vim 编辑的东西,用cat看是有颜色的:在输入模式下按ctrl+v,再按向左的箭头,得到^[这样的字符(如果有多就删了),最后组合成:[[31mred color^[[0m。用cat看就成了红色的了。当然也可以用这种更简单的方式:color=seq 31 37|sort -R|head -1; echo -e "\033[1;5;${color}mwhat color\033[0m" >> f1
与或运算,重点掌握短路运算就行:


简单说短路运算,就是&&如果第一个为0,那么就不用看后面的了,||第一个为1那也就不用看第二个的了。利用这两个特性我们就可以有简单的逻辑判断了,比如:id kju147 &> /dev/null && echo true,前面的命令为真,那么久执行我们的echo。本质上还是判断echo $?
要ping一台主机(只ping一次,等待1秒钟返回):ping www.baiduxxxxx.com -w1 -c1 &> /dev/null && echo the host is up|| echo the host is down
异或:简单理解同性不行异型行,两个不同的异或反而返回真(非0),相同返回0.他是根据二进制异或(不同则为1)。高级点的用法:把a=1,b=2,把他们互换结果,推导如下
a 1010
b 0101
根据上面异或的逻辑结果就是1111,把结果赋值给a:
a=1;b=2;a=$[a^b];b=$[a^b];a=$[a^b];echo $a;echo $b
一些可能会犯的错:
expr $n + 0;echo $?,没有值,得出的结果1,可知expr是不能做结果为0的运算,会当成失败的
let m=0;echo $?这里得出的结论也是1,换言之,let也认为0结果的是失败的,那这样也是错误的做法:i=0;let i++;echo $? 同样会得出1的结果
这样的原因:i=0;j=0;let sum=i+j&& echo $sum ,那这样要怎么打印

test 跟[] 是一样的,但是一般我们用后者,test跟[都是内部命令
比如说比较两个字符串是否相同: str1=abc;str2=def;test $str1 = $ str2;echo $也可以写成? .也可以写成[ $str1 == $str2 ],必须注意空格!!!!
【】里面必须加引号,只要里面有东西就为真,你里面就[ “ ” ]这样也有东西(有个空格),因此你变量必须加引号,**大神的写法:[ “x$path” == “x” ] && echo false || echo true