首页 |  我的博客 |  查看该博主内容分类 | 

Bash Shell脚本常用基础知识

条件if

  • 格式
if [...]; then   # 如果是一行,需要“;”分隔
	...
fi

# 简写
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"  # && 等同于then
[]可以转化为test:if test $num -eq 0    等价于   if [ $num –eq 0 ]

不支持整数变量直接if,必须:if [ i –ne 0 ]。但支持字符串变量直接if,if [ str ] 如果字符串非0。if 函数 返回值0为真走then,相反否之。

  • 与,多个命令都执行成功才走then

    • 命令,换行表示

      if
      ...
      ...
      then
      ...
      else
      ...
      fi
      
  • 表达式,-a 表示and

    if [ 表达式1 –a 表达式2 ]

  • 非, -o 表示or

    if [ 表达式1 –o 表达式2 ]

  • 空-z 非空-n

逻辑表达式说明

  • 表达式可与= != -d –f –x -ne -eq -lt等合用,如if [ -z "$JHHOME" -a -d $HOME/$num ]:如果变量$JHHOME为空,且$HOME/$num目录存在

  • 逻辑符号就正常的接其他表达式,没有任何括号( ),就是并列

for/while循环

for i in /usr/loacl/src/* 或 {0..5} 或 字符串 字符串 字符串
do
	执行语句(变量$i)
done

while 条件
do
	执行语句
done

case用法

case 字符串 in
	1|Mo)
		echo "Monday"
		;;
	2|Tu)
		echo "Tuesday"
		;;
	*)
		echo "unknow input"
		exit 1
		;;
esac

;; 类似于break
*) 类似于else
| 类似于or

函数

# $1为参数
func(){
    echo "my name is $1"
}
# 函数调用
func "smart"

比较

  • 整数变量:-gt -ge -lt -le -eq -ne (大于、大于等于、小于、小于等于、等于、不等于),注意有横杠-
  • 字符串:= != -n -z (等于、不等于、非空、为空), if [ $string ] 表示非空(与-n类似)

格式要求

赋值等号两边没空格,字符串比较有空格

获取外部执行shell脚本时的输入,$1、$2...

$1$2$3...

如执行sh test.sh var1 var2,$1、$2分别获得var1、var2

read:获取执行过程中的输入

echo 'your choice:'
read choice
# choice会获得输入值
# 或
read -p "input file name:" FILENAME
echo $FILENAME

变量的使用

  • 变量可直接充当路径的一部分,如: cp -rf /target/path $file_home/other/pathcd $cur_dir/soft
  • 充当字符串一部分需要${var}的格式,如:echo "${filename} download failed"
  • 指代带有空格的字符串,要加引号:'$var',所以一般不固定的变量,最好用引号包起来出

判断文件,if [-f 'filepat']

  • if [ -f 'file' ] 是否存在,如:if [ -f "/usr/lib/systemd/system/mysqld.service" ]
  • if [ -s 'file' ] 存在且非空
  • if [ -r 'file' ] 存在且可读
  • if [ -w 'file' ] 存在且可写
  • if [ -x 'file' ] 存在且可执行

判断目录,if [-d 'path']

if [ -d 'path' ]

命令同一行时,使用“;”冒号分隔

if [ -f "/etc/rc.d/init.d/mysqld" ]; then

获取文件名

basename 文件(支持绝对/相对路径) 文件格式 如:basename mysql_install-8_0_23-x86_64.tar.gz .tar.gz得到 mysql_install-8_0_23-x86_64

cut:按分隔符分隔内容,类似split

cut -d ' ' -f 1 file.txt

  • -d:分隔符,按照指定分隔符分割列。与 -f 一起使用
  • -f:依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思(列号,提取第几列),如-f 2,3取2到3列

awk:与cut类似,但比cut更灵活

awk -F ' ' {print $1} 以空格为分隔,打印第一列

判断rpm安装包是否已安装成功

  • if [ rpm -qa | grep mysql > /dev/null ];then ,表示成功安装
  • if [ ! rpm -qa | grep mysql > /dev/null ];then ,表示未成功安装

函数

  • 定义:func() {...} 注意()和``
  • 使用:func

退出/返回值

exit 返回值

获取执行命令的返回值

$?用以获取上一条命令的返回值,一般正常执行返回0。exit 返回值可以用该命令获取结果。

执行命令脚本

sh script.sh

`xxx`和'xxx'的区别

使用反引号赋值的变量时,会执行反引号中的内容,结果是什么,变量就赋值到什么,而引号只是作为字符串赋值。

其他遵循shell命令规则。

其他知识

  • 关闭selinux防火墙

    setenforce 0

  • sed

    • -r 支持正则(不加也支持正则)

    • -e 支持多条sed命令

    • -i 's|xxx|x|;s|xx|x|' 其中的; 支持多条替换命令

    • 需要换行,用\ ,如:

      sed -e 's|xxx|x|' \
          -e 's|xxx|x|' \
          -e 's|xxx|x|' \
          -e 's|xxx|x|' \
          -i /your/file/path
      # 当然不仅只是支持替换
      
  • 将输出的文字进行修整

    cat xxx|sed 's|...|..|'

    cat /etc/redhat-release|sed -r 's/. ([0-9]+)\../\1/' #获取linux版本号 -r 同python字符串的r

posted @ 2022-09-22 00:15  Z哎呀  阅读(103)  评论(0)    收藏  举报