Shell 常用代码片段

  • A+
所属分类:编程开发

摘要

本文主要记录常用的Shell代码片段。

在线Shell终端网站

链接

分析

中文输出乱码问题

很多使用中文输出的程序,在shell中,中文可能会出现编码问题。
将字符集设置为中文utf8,这个语句可以放到bash_profile中,启时自动设置。

export LANG="zh_CN.UTF-8"

如果还有乱码,需要注意下终端程序的编码设置

条件判断

数字判断

  • -eq: 测试两个整数是否相等;比如 $A -eq $B
  • -ne: 测试两个整数是否不等;不等,为真;相等,为假;
  • -gt: 测试一个数是否大于另一个数;大于,为真;否则,为假;
  • -lt: 测试一个数是否小于另一个数;小于,为真;否则,为假;
  • -ge: 大于或等于
  • -le:小于或等于

判断命令返回值

命令成功返回值为0

command
if [ $? -eq 0 ]; then
   # 命令执行成功
fi

多条件判断

if [[ 1 -eq 1 ]] && [[ 1 -ne 2 ]]
then
    echo "ok"
fi

循环

打印序列

for i in $(seq 1 10)
do 
     echo $i
done

读取某个文件获取从某个命令获取

for i in `ls /root`
do 
     echo $i
done

单行

for i in `ls /root`;do echo $i;done

如何解决空格被截断的问题

比如类似上面的文本,for循环时,会将空格也截断。
这需要使用一个控制符IFS来处理,可以指定分割符。
默认截断:
- 空格
- 制表符
- 换行符
示例

IFS=$'\n'   #只希望截断回车,注意回车前面必须加$
IFS=$'\n '  #截断回车和空格

数组操作

x="a b c d"
array=($x) #字符串转数组
echo 直接输出数组,${array}  #打印第一个
echo 数组元素,${array[2]}
echo 数组所有内容,${array[*]}    #注意,用这个方式传参时,会被打撒
echo 数组长度,${#array[@]}      # 获取数组长度

printf "\n\n"
# 数组遍历
echo "=====array下标是@,加不加引号没区别====="
for i in ${array[@]}
do
 echo print,$i
done

printf "\n\n"
echo "=====array下标是*,加了引号,作为一行字符串====="
for i in "${array[*]}"
do
 echo print,$i
done

printf "\n\n"
echo "=====array下标是*,不加引号====="
for i in ${array[*]}
do
 echo print,$i
done

注意点

  1. 直接使用数组变量,只会输出数组第一个元素。要输出整个数组,需要用@或者*。
  2. 数组的下标,用@或者*是有区别的,如果是*时,加上双引号就会变成字符串,@则不会。

将切分后的数据输出成一行

比如我们处理数据后,得到了一个ip列表,此时想把列表放入数据库中查询,可以将列表组合成一行。用SQLIN操作符查询。
以下是两个处理命令,选择一个,将数据通过管道对接即可。
这个命令通过替换回车实现。

tr "\r\n" ","

这个命令通过 awk 处理。

awk '{{printf"%s,",$0}}'

注意: 由于末尾有可能会多出一个逗号,记得去掉。

使用进程池控制多任务并行

当需要执行多条命令时,为了加快速度,常用做法是使用多任务并行。即使用循环执行命令,并且加上&让命令后台运行,然后使用wait等待其结束。
但当需要执行非常多的命令时,简单粗暴的后台运行会导致机器卡死。此时需要控制进程数量。
较为简单的办法是在循环中加入计数,每批命令限制一定数量,这能解决大部分问题。
但极端情况是在这些命令中,有部分命令执行很快,有的非常非常慢。此时,这个最慢的任务会拖累整体进度,因为它不结束,循环便无法执行。
而应对这种情况,最好的办法就是池化处理,将命令放入队列,丢入进程池中,一个命令运行结束,下个命令就会立刻下发。这是最高效的方式。
Shell中,也有这样的工具,就是xargs,通过管道将命令行丢入进程池。

cat command_list | xargs -P 10 -L 1 -i bash -xc {}

参数

  1. -P [num] 进程池的进程数量。
  2. -L [num]/-l[num] 一次读取几行,运行命令通常是一行,必须存在
  3. -i 将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。必须存在,避免命令参数丢失。
  4. bash -c [command] bash如果想直接运行命令,必须带上 -c

其它: 如果需要重定向输出,建议保存到脚本运行。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: