Linux Shell常用小功能汇总实现

具体实现样例

Shell实现while循环

while 循环体
do
循环体
done

  • 非死循环实现
    注意:while循环条件中括号与内部内容之间留有空格
1
2
3
4
5
6
7
# 循环输出0-10
i=0
while [ $i -le 10 ]
do
echo $i
i=$[$i+1]
done
  • 死循环实现
    死循环while条件可直接用“:”,注意“:”两边有空格
    当然也可以直接将循环条件变成恒为True的情况,比如下面两种
    while [ "1" = "1" ]
    while test "1" = "1"
1
2
3
4
5
6
7
i=0
while :
do
echo $i
i=$[$i+1]
sleep 2s
done

Shell判断文件或文件夹是否存在

更多判断条件见Shell脚本中和文件相关的判断符

  • 文件是否存在判断
    注意:if条件中括号与内部内容之间留有空格
1
2
3
4
5
if [ -f "/home/filename" ];then
echo "文件已存在"
else
echo "文件不存在"
fi
  • 文件夹是否存在判断
    注意:if条件中括号与内部内容之间留有空格
1
2
3
4
5
if [ -d "/home/" ];then
echo "文件夹存在"
else
echo "文件夹不存在"
fi

Shell判断一个变量或输入参数是否为空

  • 判断变量是否为空
    变量从终端获取
1
2
3
4
5
6
read -p "请输入:" varvalue
if [ ! -n "$varvalue" ] ;then
echo "未输入,变量为空"
else
echo "已输入,变量非空:$varvalue"
fi

变量直接赋空

1
2
3
4
5
6
varvalue=
if [ ! $varvalue ]; then
echo "变量为空"
else
echo "变量非空"
fi
  • 判断输入参数是否为空
1
2
3
4
5
if [ ! -n "$1" ] ;then
echo "参数为空"
else
echo "参数非空:$1"
fi

除以上方法外,还可以用如下判断条件判断
if test -z "$varvalue"
if [ "$varvalue" = "" ]

Shell中等待一定时间或等待进程结束实现

  • 等待一定时间
    sleep支持的时间单位为 h(时),m(分),s(秒)
1
2
3
4
sleep 3  # 不加单位默认是秒,等待3秒
sleep 1s # 等待1秒
sleep 1m # 等待1分
sleep 1h # 等待1小时
  • 等待进程或作业执行完毕
    wait支持等待进程或作业执行完毕。
    可通过jobs命令查看后台进行中的作业
1
2
3
wait  # 等待当前进程结束后执行
wait 1234 # 等待进程号为1234进程结束后执行
wait %1 # 等待作业标识号为1的作业结束后执行(作业标识号前必须添加备份号"%")

Shell脚本实现并行处理数据

  • 并行实现思路之一
    可通过后台运行符&和进程等待wait组合实现
1
2
3
4
# 假设已经实现好了两个任务脚本1.sh和2.sh让这两个脚本并行执行。  
./1.sh & # 执行任务1,不阻塞等待
./2.sh & # 执行任务2,不阻塞等待
wait # 等待子进程任务1,2执行结束(确保任务都执行完毕)

Shell脚本获取某个目录下(除去指定文件)的所有文件

  • 获取某个目录下所有文件
    方式一,使用通配符*
1
2
3
4
for name in /etc/*
do
echo $name
done

方式二,使用ls命令

1
2
3
4
for name in `ls /etc/`
do
echo $name
done
  • 获取某个目录下扩展名固定的所有文件
1
2
3
4
5
6
7
8
9
10
11
12
13
for name in /etc/*.conf  # 获取etc目录下所有扩展名为.conf的文件
do
echo $name
done
```
- 获取某个目录下除去某些指定文件的所有文件
`利用lsls -a与grep -v命令组合`
`以下样例代码获取/etc/目录下的除去yum、yum.conf、c.txt三个文件的其余文件`
```bash
for name in `ls /etc/ | grep -v 'yum\|yum.conf\|c.txt'` # 注意字符串中的管道符|需要用反斜线进行转义\|
do
echo $name
done

Shell脚本连接(拼接/合并)字符串

  • Shell脚本连接字符串
    Shell字符串拼接不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string1="hello"
string2="word"
#===========#
str1=$string1$string2 #中间不能有空格,没有引号空格会被识别成终止符
str2="$string1 $string2" #被引号包围,中间可以有空格
str3=$string1": "$string2 #夹带其他字符串连接
str4="$string1: $string2" #同str3
str5="${string1}111: ${string2}222" #这种情况需要给变量名加上大括号
#===========#
echo $str1
echo $str2
echo $str3
echo $str4
echo $str5

Shell获取时间戳

1
2
3
4
date +%s  # 获取秒级时间戳
date +%s%3N # 获取毫秒级时间戳
date +%s%6N # 获取微秒级时间戳
date +%s%N # 获取纳秒级时间戳