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

相关推荐
粉红色回忆16 小时前
linux 如何自定义文件描述符
shell
薛定谔的猫_C8T61 天前
程序人生-Hello’s P2P
c语言·汇编·程序人生·shell·二进制·计算机系统·hello
孙克旭_1 天前
day027-Shell自动化编程-基础
linux·运维·自动化·shell
shut up2 天前
Git的使用技巧
gitee·github·shell
粉红色回忆2 天前
linux简单理解输入输出重定向
shell
开挖掘机上班2 天前
Bash shell四则运算
linux·开发语言·bash·shell
Johny_Zhao3 天前
Linux服务器(CentOS/Ubuntu)接口Bond模式详解、配置指南及交换机对应接口的配置示例
linux·网络安全·信息安全·云计算·shell·cisco·huawei·系统运维·华三
粉红色回忆3 天前
简单理解linux文件描述符
shell
Johny_Zhao3 天前
Burp Suite 企业级深度实战教程
linux·网络·网络安全·信息安全·云计算·shell·burp suite·系统运维·itsm
code monkey.5 天前
【寻找Linux的奥秘】第九章:自定义SHELL
linux·shell·c/c++