摘自 《Linux shell 脚本攻略》未完待续!!!
转义,格式化shell
printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456
彩色 重置=0,黑色=40,红色=41,绿色=42,黄色=32,蓝色=44,洋红=45,青色=46,白色=47数组
echo -e "\e[1;31m This is red text \e[0m"
获取进程运行时的环境变量bash
cat /proc/$PID/eviron
获取进程id函数
pgrep gedit
得到字符串长度this
length=$(#var)
识别当前shell调试
echo $0 echo $SHELL
检查是否为超级用户code
if [$UID -ne 0];then echo not root else echo root fi
整数运算递归
no1=4 no2=5 let result=no1+no2 let no+=6 result=$[no1+no2] result=$[$no1+5] result=$((no1+50)) result=`expr 3+4` result=$(expr $no1+5)
浮点运算、精度、进制、平方索引
echo "4*0.56" | bc echo "scale=2;3/8" | bc
no=100 echo "obase=2;$no" | bc no=1100100 echo "obase=10;ibase=2;$no" | bc
echo "sqrt(100)" |bc echo "10^10" |bc
输出文本重定向到文件进程
#覆盖 echo "x" > temp.txt #追加 echo "x" >> temp.txt #无输出 ls + 2>out.txt # 分别重定向 cmd 2>stderr.txt 1>stdout.txt # 都被重定向到同一文件 cmd 2>&1 output.txt cmd &>output.txt #丢弃 some_command 2> /dev/null #从stdin读取,加行号输出 cat a* | tee out.txt |cat -n #追加 cat a* | tee -a out.txt |cat -n
文件重定向到命令
#从文件读取数据 cmd<file
<
从文件中读取到stdin>
截断模式的文件写入>>
追加模式的文件写入
# 用文件描述符3打开并读取文件 exec 3<input.txt echo this is a test line>input.txt exec 3<input.txt cat <&3 # 用于写入截断 exec 4>output.txt # 用于写入追加 exec 5>>input.txt
数组
#定义 array_var=(1 2 3 4 5 6) array_var[0]="test1" #打印 echo ${array_var[0]} index=5 echo ${array_var[$index]} #打印清单 echo ${array_var[*]} echo ${array_var[@]} #打印长度 echo ${#array_var[*]}
关联数组
#声明 declare -A ass_array #内嵌索引声明 ass_aray=([index1]=val1 [index2=val2]) #独立索引声明 ass_array[index1]=val1 #获取索引列表 echo ${!array_var[*]} echo ${!array_var[@]}
别名
alias install='sudo apt-get install' alias rm='cp $@ ~/backup; rm $@'
终端信息
#获取终端行数和列数 tput cols tput lines #将光标移动到(100,100) tput cup 100 100 #设置终端背景色 no=0~7 tput setb no #设置文本前景色 tput serf no #设置文本样式粗体 tput bold #设置下划线起止 tput smu1 tput rmu1 #删除当前光标位置到行尾的全部内容 tput ed
阻止将输出发送到终端
echo -e "enter password:" stty -echo read password stty echo echo echo password read
获取设置日期和延时
#可阅读的格式 date #时间戳 秒 date +%s #日期转时间戳 date --date "Thu Nov 18 08:07:21 IST 2010" +%s #获取星期 date --date "Jan 20 2001" + %A #日期格式化打印 data "+%d %B %Y" #设置日期和时间 date -s "21 June 2009 11:01:22"
延时
sleep no_of_seconds
调试脚本
bash -x script.sh sh -x script #启用禁止调试打印 #在执行时显示参数、命令 set -x #禁止调试 set +x #当命令进行读取时显示输入 set -v #禁止打印输入 set +v
函数和参数
function fname() { statements } fname() { statements } #递归 F(){ echo $1; F hello; sleep 1; } #导出 export -f fname #获取命令或函数返回值 echo $?; #命令传参 command -p -v -k
fname(){ echo $1,$2;#参数1 2 echo "$@";#以列表的方式一次性打印全部参数 "$1" "$2" "$3" echo "$*";#参数被做为单个实体 "$1c$2c$3" 其中c是IFS的第一个字符 return 0; }
fork炸弹
:(){ :|:& };:
#读取命令输出,双引号用以保留空格和换行符 output="$(COMMANDS)" output=`ls | cat -n`