Shell笔记
# 第一行
#!/bin/bash
echo "Hello World !"
#!
是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
# 执行
# 方式1:作为可执行程序
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
# 方式2:作为解释器参数
/bin/sh test.sh
# 注释
单行注释
# 这样
多行注释
# 开头 :<<标识
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
# 结束 标识
# 标识不一定是EOF,也其他,如COMMENT
: <<'COMMENT'
这是注释的部分。
可以有多行内容。
COMMENT
# 最简洁的写法 : + 空格 + 单引号
: '
这是注释的部分。
可以有多行内容。
'
# 变量
# 定义 - 普通
RUNOOB="www.runoob.com"
LD_LIBRARY_PATH="/bin/"
_var="123"
var2="abc"
规范:
- 只包含字母、数字和下划线
- 不能以数字开头
- 常量使用大写
- 避免使用特殊符号
# 定义 - 只读
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com" # 报错:/bin/sh: NAME: This variable is read only.
# 类型
# 字符串
my_string='Hello, World!'
my_string="Hello, World!"
# 整型
declare -i my_integer=42
# 数组
my_array=(1 2 3 4 5)
# 关联数组
declare -A associative_array
associative_array["name"]="John"
associative_array["age"]=30
# 环境变量
echo $PATH
# 特殊变量
$0 # 表示脚本的名称
$1, $2 # 表示脚本的参数。
$# # 表示传递给脚本的参数数量
$? # 表示上一个命令的退出状态等
# 赋值
# 正确的赋值
variable_name=value
# 不要加空格,有可能会导致错误
variable_name = value
# 语句赋值
for file in `ls /etc`
# 或
for file in $(ls /etc)
# 可重复赋值
your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name
# 使用
在变量名前面加美元符号 $
your_name="qinjx"
echo $your_name
echo ${your_name}
# 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done
# 删除
unset variable_name
# 字符串操作
# 定义
# 单引号
str='this is a string'
# 双引号
your_name="runoob"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
变量 | 转义字符 | |
---|---|---|
单引号 | × | × |
双引号 | √ | √ |
# 拼接
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1 # hello, runoob ! hello, runoob !
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3 # hello, runoob ! hello, ${your_name} !
Tip
如出现类似提示: line 5: echo hello,: command not found
,说明粘贴的代码 echo 行的空格有问题,删除空格重新输入。
# 长度
变量前加 #
string="abcd"
echo ${#string} # 输出 4
# 子串
从字符串索引 1
开始截取 4 个字符:
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
# 查找
查找字符 i 或 o 的位置 (哪个字母先出现就计算哪个):
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4
注意: 以上脚本中是反引号,而不是单引号
# 数组操作
bash 支持只一维数组(不支持多维数组),并且没有限定数组的大小。
# 定义
# 数组名=(值1 值2 ... 值n)
array_name=(value0 value1 value2 value3)
array_name=(
value0
value1
value2
value3
)
# 单独定义
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
# 读取
# ${数组名[下标]}
valuen=${array_name[n]}
# @ 获取数组中的所有元素
echo ${array_name[@]}
# 长度
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
length=${#array_name[n]}
# 流程控制
Title
结构体不能为空
# if else
# if
if condition
then
command1
command2
...
commandN
fi # 末尾的 fi 就是 if 倒过来拼写
单行写法:
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
# if else
if condition
then
command1
command2
...
commandN
else
command
fi
# if else-if else
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
# 判断语句
[...]
判断语句中大于使用 -gt,小于使用 -lt。
if [ "$a" -gt "$b" ]; then
...
fi
((...))
作为判断语句,大于和小于可以直接使用 > 和 <
if (( a > b )); then
...
fi
# for
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
# 常见条件
for ((i = 0; i < gpu_count; i++)) # 次数遍历
for str in This is a string # 元素遍历
单行写法:
for var in item1 item2 ... itemN; do command1; command2… done;
# while
while condition
do
command
done
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
# case (switch)
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
*) echo '相当于default' ;;
esac
# 跳出循环
与其他语言的关键字( break
、 continue
)一样,作用也一样。
# 函数
[ function ] funname [()]
{
action;
[return int;]
}
示例:
# 无返回函数
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
# 有返回
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !" # 函数返回值在调用该函数后通过 $? 来获得
# 传参
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
上次更新: 2024/11/16, 16:33:39