shell脚本基础语法记录

1.变量的使用

1.1 变量的定义

Shell 支持以下三种定义变量的方式

bash 复制代码
url=chadm
echo $url
name='chadm'
echo $name
author="chadm"
echo $author

# 打印变量有2种方式
echo $author
echo ${author}

# (())和let都只能使用整数
a=$((10+66)
echo $a
let b+=6
echo $b

注意,赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样

1.2 将命令的结果赋值给变量

bash 复制代码
variable=`command`
variable=$(command)

1.3 获取输入参数

运行 Shell 脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用$n的形式来接收,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推

bash 复制代码
#定义函数
function func(){
    echo "Language: $1"
    echo "URL: $2"
}
#调用函数
func shell "https://test"

特殊参数

  • $0 当前脚本的文件名。
  • $n(n≥1) 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是$2。
  • $# 传递给脚本或函数的参数个数。 $* 传递给脚本或函数的所有参数。 $@ 传递给脚本或函数的所有参数。当被双引号""包含时,
  • $@ 与 $* 稍有不同 $? 上个命令的退出状态,或函数的返回值,
  • $$ 当前 Shell 进程 ID。对于 Shell
    脚本,就是这些脚本所在的进程 ID。

2.字符串相关

2.1 获取字符串长度

使用命令: ${#string_name}

bash 复制代码
str="hello world"
echo ${#str}  // 输出结果是11

2.2 字符串拼接

在 Shell 中你不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接

bash 复制代码
name="Shell"
url="http://test"
str1=$name$url  #中间不能有空格
str2="$name $url"  #如果被双引号包围,那么中间可以有空格
str3=$name": "$url  #中间可以出现别的字符串
str4="$name: $url"  #这样写也可以
str5="${name}Script: ${url}index.html"  #这个时候需要给变量名加上大括号
echo $str1
echo $str2
echo $str3
echo $str4
echo $str5

输出结果:

Shellhttp://test

Shell http://test

Shell: http://test

Shell: http://test

ShellScript: http://testindex.html

2.3 字符串截取

从左开始截取:${string: start :length}

string 是要截取的字符串,start 是起始位置(从左边开始,从 0 开始计数),length

是要截取的长度(省略的话表示直到字符串的末尾

从右开始截取:${string: 0-start :length}

同第 1) 种格式相比,第 2) 种格式仅仅多了0-,这是固定的写法,专门用来表示从字符串右边开始计数

示例:

bash 复制代码
# 截取最后一位,都是输出o
name="hello"
echo ${name:4:1}   # 从左边开始截取

echo ${name:0-1:1}  # 从右边开始截取

总结:

  • ${string: start :length} 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
  • ${string: start} 从 string 字符串的左边第 start 个字符开始截取,直到最后。
  • ${string: 0-start :length} 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
  • ${string: 0-start} 从 string 字符串的右边第 start 个字符开始截取,直到最后。
  • **${string#chars}* 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
  • **${string##chars}* 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
  • **${string%chars}* 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
  • **${string%%chars}* 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符

3.数组的使用

在 Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔

bash 复制代码
arr=(12 23 "hello" )
# 获取数组第一个元素
echo ${arr[0]}

# 获取所有元素
echo ${arr[*]}
echo ${arr[@]}

# 获取数组长度
echo ${#arr[*]}
echo ${#arr[@]}

# 数组拼接
arr2=(56 "world")
arr3=(${arr[*]} ${arr2[*]})
echo ${arr3[*]}

对应的输出结果

12

12 23 hello

12 23 hello

3

3

12 23 hello 56 world

4.逻辑流程控制

4.1 if/esle语句

最后必须以fi来闭合,fi 就是 if 倒过来拼写

bash 复制代码
if  condition
then
    statement(s)
fi

或者
if  condition;  then
    statement(s)
fi

针对整数的,使用(())

双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令

bash 复制代码
a=1
b=2
if (( $a == $b ))
then
    echo "a和b相等"
else
    echo "a和b不相等"
fi

针对字符串

[[ ]]是 Shell 内置关键字,它和 test 命令类似,也用来检测某个条件是否成立

bash 复制代码
str1="1"
str2="2"
if [[ -z $str1 ]] || [[ -z $str2 ]]  #不需要对变量名加双引号
then
    echo "字符串不能为空"
elif [[ $str1 < $str2 ]]  #不需要也不能对 < 进行转义
then
    echo "str1 < str2"
else
    echo "str1 >= str2"
fi

4.2 循环

break 用来结束所有循环,循环语句不再有执行的机会;continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环

while

bash 复制代码
while ((i <= 10))
do
    ((sum += i))
    ((i++))
done
echo "The sum is: $sum"

switch

bash 复制代码
printf "Input integer number: "
read num
case $num in
    1)
        echo "Monday"
        ;;
    2)
        echo "Tuesday"
        ;;
    3)
        echo "Wednesday"
        ;;
    4)
        echo "Thursday"
        ;;
    5)
        echo "Friday"
        ;;
    6)
        echo "Saturday"
        ;;
    7)
        echo "Sunday"
        ;;
    *)
        echo "error"
esac

for

bash 复制代码
sum=0
for ((i=1; i<=10; i++))
do
    ((sum += i))
done
echo $sum

5.运算&判断

5.1 数字

bash 复制代码
num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

参数 说明

  • -eq 等于则为真
  • -ne 不等于则为真
  • -gt 大于则为真
  • -ge 大于等于则为真
  • -lt 小于则为真
  • -le 小于等于则为真

5.2 字符串

bash 复制代码
num1="hello"
num2="world"
if test $num1 = $num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

参数说明

  • = 等于则为真
  • != 不相等则为真
  • -z 字符串 字符串的长度为零则为真
  • -n 字符串 字符串的长度不为零则为真

5.3 文件

bash 复制代码
cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

参数 说明

  • -e 文件名 如果文件存在则为真
  • -r 文件名 如果文件存在且可读则为真
  • -w 文件名 如果文件存在且可写则为真
  • -x 文件名 如果文件存在且可执行则为真
  • -s 文件名 如果文件存在且至少有一个字符则为真
  • -d 文件名 如果文件存在且为目录则为真
  • -f 文件名 如果文件存在且为普通文件则为真
  • -c 文件名 如果文件存在且为字符型特殊文件则为真
  • -b 文件名 如果文件存在且为块特殊文件则为真

5.4 bool运算&逻辑运算

bool运算

  • ! 非运算,表达式为 true 则返回 false,否则返回 true。
    -[ ! false ] 返回 true。
  • -o 或运算,有一个表达式为 true 则返回 true。
    [ $a -lt 20 -o $b -gt 100 ] 返回 true。
  • -a 与运算,两个表达式都为 true 才返回 true。
    [ $a -lt 20 -a $b -gt 100 ] 返回 false。

逻辑运算

  • && 逻辑的 AND
    [[ $a -lt 100 && $b -gt 100 ]] 返回 false
  • || 逻辑的 OR
    -[[ $a -lt 100 || $b -gt 100 ]] 返回 true
相关推荐
Selina K10 小时前
shell脚本知识点记录
笔记·shell
Dangks3 天前
[运维] 服务器本地网络可用性检查脚本
linux·运维·服务器·shell·network·系统工具
DreamADream5 天前
Shell编程中关于用户操作报错`用户无法登录`
shell
江上清风山间明月8 天前
shell脚本编写注意细节 ==、=等的区别
bash·shell·注意·相等·细节·==·=
避凉闲庭10 天前
ansible开局配置-openEuler
linux·运维·ansible·脚本·openeuler·免密登录·批量化
风123456789~10 天前
【Linux】按时间抽取附件
linux·运维·服务器·脚本
188_djh12 天前
# linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十六)--shell
linux·运维·bash·shell·shell入门·shell变量·linux入门到精通
RamboPan13 天前
Mac 使用脚本批量导入 Apple 歌曲
macos·自动化·shell·apple·script
I'm Jie13 天前
一站式学习 Shell 脚本语法与编程技巧,踏出自动化的第一步
linux·ssh·shell·shell脚本·shell编程
盛夏省下14 天前
2024最新青龙面板安装教程
linux·脚本·1024程序员节·青龙面板·青龙