摘自《Linux 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"

获取进程运行时的环境变量

cat /proc/$PID/eviron

获取进程id

pgrep gedit

获得字符串长度

length=$(#var)

识别当前shell

echo $0
echo $SHELL

检查是否为超级用户

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"
  • 星期 %a %A
  • 月 %b %B
  • 日 %d
  • 固定格式日期(mm/dd/yy)%D
  • 年 %y %Y
  • 小时 %I %H
  • 分钟 %M
  • 秒 %S
  • 纳秒 %N
  • 时间戳 %s

延时

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`

seasonley
607 声望693 粉丝

一切皆数据