基本shell编程
1.终端打印
echo是终端打印的基本命令。
使用不带引号的echo时,你没法在所要显示的文本中使用,例如echo hello;hello,echo hello为一个命令,第二个hello则被视为另一个命令;
使用带单引号的echo时,bash不会对单引号中的变量求值,而只是原样输出,例如:echo '$var'将会返回$var,而echo $var将会根据变量$var定义与否,返回$var的值,或者什么都不返回;
2. 变量和环境变量
#!/bin/bash #获取应用程序gedit的进程ID pgrep httpd #输出:22202 #获取与该进程相关的环境变量 cat /proc/22202/environ #输出:MANPATH=:/usr/share/bin/manSHELL=/bin/bash #将替换命令将分隔符进行替换由'\0'变为'\n' cat /proc/22202/environ | tr '\0' '\n' #输出:MANPATH=:/usr/share/bin/man #输出:SHELL=/bin/bash #给变量赋值 var="value" echo $var echo ${var} #输出:value fruit=apple count=5 echo "We have $count $fruit(s)" #输出:We have 5 apple(s) #环境变量的2种设置方式:方式1--export echo $PATH #输出:/usr/share/xxx/bin:/home/work/bin export PATH="$PATH:/home/work/temp/bin" #输出:/usr/share/xxx/bin:/home/work/bin:/home/work/temp/bin #环境变量的2种设置方式:方式2--export另用 echo $PATH #输出:/usr/share/xxx/bin:/home/work/bin PATH="$PATH:/home/work/temp/bin" export PATH #输出:/usr/share/xxx/bin:/home/work/bin:/home/work/temp/bin #获取字符串长度 var=1234567890 length=${#var} echo length #输出:10
3.数学运算
1 #!/bin/bash 2 3 no1=4 4 no2=5 5 result=$no1+$no2 6 echo $result 7 #output:4+5 8 let result=no1+no2 9 echo $result 10 #output:9 11 12 #let命令完成基本的算术运算 13 let no1++ 14 let no1-- 15 let no1+=6 16 17 #操作符[]完成基本的算术操作 18 result=$[no1 + no2] 19 result=$[$no1 + no2] 20 result=$((no1 + 50)) 21 22 #expr完成基本的算术运算 23 result=`expr 3 + 4` 24 result=$(expr $no1 + 5) 25 26 #bc可以支持浮点数运算 27 echo "4 * 0.56" | bc 28 #output:2.24 29 no=54 30 result=`echo "$no * 1.5" | bc` 31 echo $result 32 #output:81.0
4.文件描述符和重定向
最常见的文件描述符是:stdin(0)(标准输入),stdout(1)(标准输出),stderr(2)(标准错误)。
>和>>的不同:前者会清空文件,再写入内容;后者会将内容追加到现有文件的末尾;
1 echo "This is a sample text 1" > temp.txt 2 echo "This is a sample text 2" >> temp.txt 3 #将标准错误输出重定向到一个文件,将stdout重定向到另一个文件 4 cmd 2>stderr.txt 1>stdout.txt 5 #将stderr转换成stdout,使得两者都被重定向到同一个文件中 6 cmd 2>&1 output.txt 7 8 #tee可以实现一方面将数据重定向到文件,另外还可以提供一个副本作为后续命令的stdin 9 cat file1 | tee out.txt | cat -n 10 #tee接收到来自stdin的数据,它将stdout的一份副本写入文件out.txt,同事将另一份副本作为后续命令的stdin 11 #将文件重定向到命令 12 cmd < fiel1
5.数组和关联数组
1 #定义数组 2 array_var=(1 2 3 4 5 6) 3 #通过下标访问数组值 4 echo ${array_var[2]} 5 #以清单形式打印数组中的所有值 6 echo ${array_var[*]} 7 echo ${array_var[@]} 8 #打印数组长度 9 echo ${#array_var[*]} 10 11 #对于关联数组,首选需要使用单独的声明语句将一个变量名声明为关联数组 12 declare -A ass_array 13 #添加元素到数组中 14 ass_array[x1]='apple' 15 ass_array[x2]='pea' 16 #显示数组内容 17 echo ${ass_array[x1]} 18 #显示数组索引 19 echo ${!ass_array[*]}
6.别名使用
1 #创建一个别名 2 alias new_cmd='command seq' 3 #为保证别名一直可用,将其放入~/.bashrc中 4 #每当一个新的shell进程生成时,都会执行~/.bashrc中的命令 5 echo 'alias cmd="command seq"' >> ~/.bashrc