一些shell命令

  • for循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
for file in `ls /etc`

for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done

for (( EXP1; EXP2; EXP3 ))
do
# do something
done

while condition
do
# do something
done

until condition
do
# do something
done

# while : 等效于 while true
# There's no real difference in behavior. Both commands do nothing and exit with a successful status. : emphasizes doing nothing; true emphasizes the successful status.
  • if
1
2
3
4
5
6
7
8
9
10
11
12
if condition
then
# do something
elif
# do something
else
# do something
fi

if [ -e "$filename" ] # 文件是否存在,r、w、x是否可读、写、执行
# d是否为目录、f是否为文件
if [ $var -gt 0 ] # 还有lt、ge、le、eq、ne
  • case
1
2
3
4
case "$varname" in
[a-z]) echo "abc";;
[0-9]) echo "123";; #还不知道为啥这么写,以后再补充吧
esac
  • 文件包含
1
2
source ./function.sh
. ./function.sh
  • 字符串
1
2
3
4
5
string="abcd"
echo ${#string} # 字符串长度

string="zhe pian tai shui le"
echo ${string:13:4} # shui
  • 数组
1
2
3
4
5
arr=(1 2 3 4 5)
echo ${arr[3]}

echo ${#arr[@]} # 数组长度
echo ${arr[#arr[@]-1]} # 最后一个元素
  • 问号,和C里面的问号一样
1
2
a=10
(( t=a<50?0:1 )) # t=0
  • /dev/null是个空文件,清空一个文件可以用cat /dev/null > tmp.log,不想保存log,也不想输出到屏幕,可以1>/dev/null 2>&1
  • 清空一个文件也可用: > tmp.log,:是个内建命令,什么也不做,永远返回0
1
2
:
echo $? # 0
  • cp t.{txt,back} 文件名扩展
  • 大括号和小括号的区别
1
2
3
4
5
a=123
(a=321)
echo $a # 123 在子进程中修改了a的值,对当前进程没影响
{a=321;}
echo $a # 321 想当于是一个匿名函数
  • sudo sh -c "...",引号里的内容都会有sudo权限

  • echo $(( 2#101011 )),这里是2进制的意思

  • trap

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    trap "echo Booh!" SIGINT SIGTERM
    echo "it's going to run until you hit Ctrl+Z"
    echo "hit Ctrl+C to be blown away!"

    while true:
    do
    sleep 60
    done
    # kill pid” 会发送SIGTERM到进程pid.
    # 在终端中敲入interrupt key(DELETE或ctrl+c)会产生SIGINT信号。
    # kill -9 pid” 会发送SIGKILL到进程pid,SIGKILL不能被捕获,会直接结束