参考 :
shell实例练习+详解 - 999.感冒灵 - 博客园
Shell 教程 | 菜鸟教程
1.变量
1.1.pwd 赋值给变量
temp=$(pwd)
参考 : pwd结果保存到变量_qhexin的专栏-CSDN博客_pwd变量
2.运算符
2.1.算数运算符
* 运算符需要转义,需在 * 前加 \ ;
运算符前后需加空格;
2.2.逻辑运算符
大于
cat > test.sh << 'EOF'
a=11
if [ $a -gt 10 ]; then
echo "a大于10"
else
echo "a不大于10"
fi
EOF
大于 -gt (greater than)
小于 -lt (less than)
大于或等于 -ge (greater than or equal)
小于或等于 -le (less than or equal)
不相等 -ne (not equal)
3.流程控制
3.1.if else
if 条件之后 then 之前需换行;
3.2.判断前一个命令是否运行成功
if [ $? -eq 0 ]; then
echo "success"
else
echo "fail"
fi
参考 : shell中判断前一个命令是否执行成功 - 斜月三星一太阳 - 博客园
3.2.判断变量是否为空
参考 : https://blog.csdn.net/weixin_43810067/article/details/124113759
base
[ -z "$var" ] && echo "Empty"
OR
[[ ! -z "$var" ]] && echo "Not empty" || echo "Empty"
base shell
为空
if [ -z "$var" ]
then
echo "\$var is empty"
else
echo "\$var is NOT empty"
fi
不为空
if [ ! -z "$var" ]
then
echo "\$var is NOT empty"
else
echo "\$var is empty"
fi
4.文件
4.1.判断文件是否存在,存在则删除
if [ ! -f "/data/filename" ];then
echo "文件不存在"
else
rm -f /data/filename
fi
4.2.获取指定路径所有文件名
参考 :Shell(Bash)编程实例之获取某个文件夹下的所有文件名(含文件夹)_立身以力学为先,力学以读书为本。 —郑耕老《劝学》-CSDN博客_shell获取文件夹下所有文件名
4.3.shell 提取文件名和目录名
参考 : shell 提取文件名和目录名_小耗子的博客-CSDN博客_bash 文件名
4.4.筛选文件夹
参考 : linux中5种方法过滤出文件夹ls -F ls -p grep、find快速查找过滤目录 - 感谢蛋炒饭 - 博客园
ls -l | grep "^d"
ls -F | grep '/$'
ls -l |awk '{if($2>1) print $0}'
4.5.shell获取本身目录
path="$( cd "$( dirname "$0" )" && pwd )"
5.进程
5.1.使用Shell脚本查找程序对应的进程ID,并杀死进程
参考 : 使用Shell脚本查找程序对应的进程ID,并杀死进程_Learning-CSDN博客_shell查找进程并杀掉
#!/bin/sh
NAME=$1
echo $NAME
ID=`ps -ef | grep "$NAME" | grep -v "grep" | awk '{print $2}'`
echo $ID
echo "---------------"
for id in $ID
do
kill -9 $id
echo "killed $id"
done
echo "---------------"
$1 为执行shell脚本的第一个参数
6.字符串
6.1.切割字符串
参考 : 【shell】shell字符串分割|文件分割|剪切|截取_bandaoyu的博客-CSDN博客_shell分割字符串
cat >test.sh<<'EOF'
#!/bin/bash
# 参数1: 要切割的字符串
# 参数2: 切割符
# 参数3: 切割后返回指定下标元素
function split(){
#保存当前shell默认的分割符,一会要恢复回去
OLD_IFS="$IFS"
#将shell的分割符号改为第二个参数
IFS=$2
#分割符是第二个参数,根据第二个参数切割第一个参数
array=($1)
#恢复shell默认分割符配置
IFS="$OLD_IFS"
echo ${array[$3]}
}
str="1=2=3=4"
split_result=`split $str = 2`
echo $split_result
EOF
7.数组
参考 : shell中数组的定义方法_芒果布丁啊的博客-CSDN博客_shell定义数组
7.1.定义数组
array=(a b c)
下标从0开始
7.2.打印数组
array=(a b c)
for var in ${array[@]}
do
echo $var
done
7.3.打印数组第2个元素
echo ${array[1]}
7.4.打印数组长度
arr=(1 2 3 4)
echo ${#arr[*]}
7.5.直接打印数组
arr=(1 2 3 4)
echo ${arr[*]}
8.结果处理
8.1.输出第一列
date | awk '{print $1}'
8.2.输出前五行
ll / | head -5
8.3.输入指定列并拼接字符串
date|awk '{print $1"-"$2"-"$3"-"$4"-"$5}'
8.4.替换
2替换成4(命令行)
echo 123 |sed 's#2#4#g'
注 : #可以为其他字符,如 / , .
2替换成4(shell脚本)
a=1223
s=${a//2/"4"}
echo $s
8.5.包含
参考 : grep怎样使用与(and) 或(or) 非(not)命令_jingwen3699的博客-CSDN博客_grep 非
包含(and)
cat 1.txt |grep a|grep b
包含(or)
cat 1.txt |grep -E "a|b"
不包含
cat 1.txt |grep -v "a"
9.函数
9.1.调用函数
注意 :
- 函数内部通过echo返回结果,函数内部所有的echo都会返回
- 函数返回值赋值通过``赋值
- 通过函数赋值可以拿到返回结果,但是函数内部修改全局变量不生效,只有单独执行该函数才会生效
cat > test.sh << 'EOF'
b=0
function test(){
echo "xxx"
b=1
}
echo $b
rs=`test`
echo $rs
echo $b
echo "----"
echo $b
test
echo $b
EOF
10.遍历命令结果
cat > run.sh <<'EOF'
#!/bin/sh
for a in $(env)
do
echo $a
done
EOF
sh run.sh
11.参数
cat > t.sh <<'EOF'
#!/bin/bash
total=$#
array=($*)
echo "参数长度: [$total]"
echo "所有参数: [$*]"
echo "所有参数: [${array[*]}]"
echo "打印参数和下标:----------------"
for ((i=1;i<=$total;i++));
do
echo " 传递参数位:$i 对应值:${array[$i-1]}"
done
EOF
sh t.sh a b 1 3