shell脚本常用片段

文件判断

if  [ -d "/XXX/" ];then
  echo  "文件夹存在"
else
  echo  "文件夹不存在"
fi

if  [ -f  "/xxx/filename" ];then
  echo  "文件存在"
else
  echo  "文件不存在"
fi

if [[ '$1' = 'tomcat' ]]; //字符串比较最好用''括起来, 防止$1 != 'asdf' 假如$1 为空会报错
then
  echo "Input is tomcat"
elif [[ '$1' = 'redis' ]] || [[ '$1' = 'zookeeper' ]];
then
  echo "Input is $1"
else
  echo "Input Is Error."
fi
if [-L /dev/link ] //判断某链接是否存在
then 
    echo "Link exist"
else
    echo "Link doesn't exist"
fi
//判断命令行执行结果
cp $UBOOT_DIR/$UBOOT_ORIG $RELEASE_DIR/
if [ $? -ne 0 ];then
	echo "please build uboot."
	exit 1
fi

-e filename 如果 filename 存在,则为真
-d filename 如果 filename 为目录,则为真
-f filename 如果 filename 为常规文件,则为真
-L filename 如果 filename 为符号链接,则为真
-r filename 如果 filename 可读,则为真
-w filename 如果 filename 可写,则为真
-x filename 如果 filename 可执行,则为真
filename1-nt filename2 如果 filename1 比 filename2 新,则为真
filename1-ot filename2 如果 filename1 比 filename2 旧,则为真

touch a
ln -s s_a a
ln -s s_aa s_a
s_a 是a的软连接 s_aa是s_a的软连接
注意 -e和-f 判断的为普通文件
文件a和 s_a可以用-e -f判断出来
s_aa不能用-e -f判断出来

链接文件可以用 -L判断出来

循环

for a in {
    
    1..10}
do
	xxxxx
done

for k in $( seq 1 10 )
do
	xxxxx
done

cd "/sys"
for k in $(ls $DIR)
do
   [ -d $k ] && du -sh $k
done

while ((i<=10))
do
  xxx
done
until ((i>10))
do
  xxx
done

1.seq 用于产生从某个数到另外一个数之间的所有整数
2.列出sys目录下各子目录占用磁盘空间的大小
3.while循环的条件测试是测真值,until循环则是测假值。

数组

ARR=(‘a’ ‘b’ ‘c’)
for (( i = 0; i < ${#ARR[@]}; i++ ))
do
if [[ KaTeX parse error: Expected '}', got 'EOF' at end of input: {ARR[i]} == “a”]]; then
echo "KaTeX parse error: Expected '}', got 'EOF' at end of input: {ARR[i]} "
fi
done

${#ARR[@]} 获取数组元素个数

参数判断

$# 获取脚本的参数个数 ./aaa.sh a b c $# == 3
if [[ $# == 1 && $1 == ‘clean’ ]]; then
make clean
exit
fi

if [ “$2” = “emmc” ]; then
xxxxx
else
xxxx
fi

比较

字符串

=  
!=
-z 字符串 字符串长度为0
-n 字符串 长度不为0

取值

在这里插入图片描述

在脚本中$xxx 或者${XXX_$abc} 这种而不是小括号,makefile取值是用小括号()。
config_${ARCH}${DEV}
这种必须用{}括起来不然,ARCH_DEV是不能识别的
config
$ARCH_$DEV,,他会认为$ARCH_是一个整体

export

脚本A中export的变量在启动其他脚本的时候会复制一份传入其他脚本。其他脚本中对此变量的修改并不会在离开脚本后生效
a.sh定义para 赋值2 export para 在a.sh 中启动b.sh 在b.sh中para值为2 在b中修改为3 并不会影响a中的值,a环境依然为2

获取当前执行脚本的绝对路径

常见的一种误区,是使用 pwd 命令,该命令的作用是“print name of current/working directory”,这才是此命令的真实含义,当前的工作目录,这里没有任何意思说明,这个目录就是脚本存放的目录。所以,这是不对的。你可以试试 bash shell/a.sh,a.sh 内容是 pwd,你会发现,显示的是执行命令的路径 /home/june,并不是 a.sh 所在路径:/home/june/shell/a.sh
但此方法在执行的脚本直接执行的话可以使用。

另一个误人子弟的答案,是 $0,这个也是不对的,这个$0是Bash环境下的特殊变量,其真实含义是
这个$0有可能是好几种值,跟调用的方式有关系:

使用一个文件调用bash,那$0的值,是那个文件的名字(没说是绝对路径噢)

使用-c选项启动bash的话,真正执行的命令会从一个字符串中读取,字符串后面如果还有别的参数的话,使用从$0开始的特殊变量引用(跟路径无关了)

除此以外,$0会被设置成调用bash的那个文件的名字(没说是绝对路径)

Jun@VAIO 192.168.1.216 23:52:54 ~ >
cat shell/a.sh
#!/bin/bash
echo '$0: '$0
echo "pwd: "`pwd`
echo "============================="
echo "scriptPath1: "$(cd `dirname $0`; pwd)
echo "scriptPath2: "$(pwd)
echo "scriptPath3: "$(dirname $(readlink -f $0))
echo "scriptPath4: "$(cd $(dirname ${
     
     BASH_SOURCE:-$0});pwd)
echo -n "scriptPath5: " && dirname $(readlink -f ${
     
     BASH_SOURCE[0]})
Jun@VAIO 192.168.1.216 23:53:17 ~ >
bash shell/a.sh
$0: shell/a.sh
pwd: /home/Jun
=============================
scriptPath1: /home/Jun/shell
scriptPath2: /home/Jun
scriptPath3: /home/Jun/shell
scriptPath4: /home/Jun/shell
scriptPath5: /home/Jun/shell
Jun@VAIO 192.168.1.216 23:54:54 ~ >

dirname $0,取得当前执行的脚本文件的父目录

cd dirname $0,进入这个目录(切换当前工作目录)

pwd,显示当前工作目录(cd执行后的)

猜你喜欢

转载自blog.csdn.net/weixin_41884251/article/details/109751549