linux shell脚本-1
1.1 终端打印——echo、printf
1、 echo 双引号、单引号:注意加转义字符;无引号:注意分号
printf "%-5s %-10s %-4s\n" No Name Mark
echo -e "包含转义序列"
echo -e "\e[1;31m This is red text \e[0m"
效果:
其他颜色:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=35,青色=36,白色=37
echo -n 忽略末尾的换行符(echo默认会将一个换行符追加到输出文本的尾部)
1.2 变量和环境变量
1、查看
env
cat /proc/$PID/environ
2、可以在双引号中引用变量值($value)
3、export设置环境变量
4、获得字符串长度:length=${#var}
5、SHELL表示用的是哪种shell,UID用来判断是否是超级用户(0是root)
1.3 通过shell进行数学计算
1、let命令可以直接执行基本的算术操作,当使用let时,变量之前不需要再加$
let result=no1+no2 let no1++ let no2--
2、其他方法
[] (()) expr
result=$[no1+no2] result=$[$no1+5] result=$((no1+50)) result=`expr 3+4` result=$(expr $no1+5)
以上方法只能用于整数运算,而不支持浮点数(老实说,对着几个符号没弄懂)
3、bc
1.4 文件描述符和重定向
1、tee命令可以接受到来自stdin的数据。它将stdout的一份副本写入文件out.txt,同时将另一份副本作为后续命令的stdin;cat -n将从stdin中接受到的每一行数据前加上行号并写入stdout:
[pocean@node235 memtrace]$ cat 1.txt | tee out.txt | cat -n 1 a 2 ab 3 abc 4 abcd 5 abcde [pocean@node235 memtrace]$ cat out.txt a ab abc abcd abcde
另外tee命令会将文件覆盖,但它提供了一个-a选项,可以用于追加内容。
1.5 数组和关联数组
array_var=(1 2 3 4 5) 或者: array_var[1]="test1" array_var[2]="test2" array_var[3]="test3" array_var[4]="test4" echo ${array_var[0]} echo ${array_var[*]} echo ${array_var[@]}
[pocean@node235 ~]$ declare -A ass_array [pocean@node235 ~]$ ass_array=([apple]='100 dollars' [orange]='150 dollars') [pocean@node235 ~]$ echo "Apple costs ${ass_array[apple]}" Apple costs 100 dollars [pocean@node235 ~]$ echo ${ass_array[*]} 150 dollars 100 dollars [pocean@node235 ~]$ echo ${!ass_array[*]} orange apple
1.6 别名
通过\cmd可以将所要运行的命令进行转义,从而忽略当前定义过的所有别名。
1.7 获取终端信息——tput
比如行数、列数、光标位置、遮盖密码字段等,详细使用自行google
1.8 调试
-xv
1.9 函数和参数
$n 第n个参数,$@ 被扩展成$1 $2 $3
$? 上个命令的返回值(0表示成功,非0表示失败)
1.10 利用子shell生成一个独立的进程
子shell本身就是独立的进程。可以使用()操作符来定义一个自shell:
pwd; (cd /bin;ls); pwd;
1.11 以不按回车键的方式读取字符
[pocean@node235 ~]$ read -n 3 var #输入n-1个数 1 2[pocean@node235 ~]$ echo $var 1 2 [pocean@node235 ~]$ read -s var #密码输入 [pocean@node235 ~]$ echo $var 123456 [pocean@node235 ~]$ read -p "Enter input:" var #提示输入 Enter input:123789 [pocean@node235 ~]$ echo $var 123789 [pocean@node235 ~]$ read -t 3 var #3秒内输入 3[pocean@node235 ~]$ read -d ":" var #到:符号时停止输入 hello:[pocean@node235 ~]$ echo $var hello
1.12 IFS 内部定界符
data="name,sex,rollno,location" oldIFS=$IFS IFS=, for item in $data do echo Item: $item done IFS=$oldIFS
1.12 循环
for var in list; do commands done list can be a string, or a sequence
while condition do commands done
1.13 比较与测试
if语句
if condition; then commands; fi if condition; then commands; elif condition; then commands else commands fi
算术比较
条件通常被放置在封闭的中括号内。一定要注意[或]与操作数之间有一个空格。如果忘记了这个空格,脚本就会出错。
[ $var -eq 0 ] [ -f/x/e/c/b/w/r/L file ]
一些操作符:
-ne:等于 -gt:大于 -lt:小于 -ge:大于或等于 -le:小于或等于
-a:逻辑与 -o:逻辑或
字符串比较最好用双中括号:
[[ $str1=$str2 ]]