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 [[${ARR[$i]} == "a"]]; then
	echo  "${ARR[$i]}"
	fi
done

ARR=(1 2 3)
for (( i = 0; i < ${#ARR[@]}; i++ ))
do
echo ${ARR[i]}
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
字符串截取

ak=123/222/333
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. #*/ 左边开始删除 直到第一个遇到/,保留/ 后面的
  2. ##*/ 左边开始 删除直到最后一个/ ,保留/ 后面的
  3. %%/*右边开始 删除最后一个/ 后面的
  4. %/*右边开始 删除第一个/ 后面的
  5. ak:0:4,从左边第0个字符开始截取4个
  6. ak:5,从左边第5个字符开始截取到最后
  7. ak:0-4:2,从右边第4个字符开始截取2个注意从1开始数的
  8. ak:0-4,从右边第4个字符开始截取到最后

取值

在这里插入图片描述

在脚本中$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执行后的)

一般用法CURRENT_DIR=$(cd $(dirname $0); pwd)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值