Shell-VI-Shell编程.md
什么是Shell编程?
Shell 编程是一种基于 Shell 解释器语法规则,结合环境变量和命令行参数,通过组织和控制系统命令以实现自动化任务与进程管理的脚本语言。
变量
tips
父进程的变量在子进程中不可见,需要使用export声明需要的变量或者使用 . child.sh 执行
shell中声明变量赋值变量名必须严格紧贴赋值符合“=”
基础变量
Shell(bash)本身提供了一些基础变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| $? $1-$9 $# $@ $* $$ $! $_ $IFS $RANDOM $LINENO $UID / $EUID $PWD $HOME $PATH $SHELL
|
通过使用上述的变量,编写第一个shell脚本
1 2 3 4 5 6 7 8 9 10
| #! /bin/bash read -p "Give me a name: " name echo hello $name echo your home path is $HOME echo current dir is $PWD
Give me a name: Codfish hello Codfish your home path is /root current dir is /home/codfish/my_bash
|
变量
1 2 3 4 5 6 7
| name="Alice" declare -i age=18 readonly pi=3.14 export PATH=$PATH:/new arr=(apple banana cherry) declare -A user user[id]=001
|
引用和执行
`` ,’’,”“,以及$(())
以上都可以作为字符串向shell脚本中的变量赋值。
反引号
: 获取命令执行后的结果作为变量的值(过时)
1 2 3 4
| hi="hello" hi1=`echo hello`
result : hello
|
单引号‘’ : 输出字符串,完全不解析
1 2 3 4 5
| hi2='echo $hi' echo $hi2
result : echo $hi1
|
双引号‘’ : 输出含变量空格信息
1 2 3 4
| hi3="echo $hi" echo $hi3
result : echo hello
|
$()’ : 获取命令执行后的结果作为变量的值,支持嵌套
1 2 3 4
| hi4=$(echo $hi) echo $hi4
result : hello
|
运算符
算术运算
1 2 3 4 5 6 7 8
| + - * / % ++ -- **
|
整数比较运算
1 2 3 4 5 6
| -eq -ne -gt -lt -ge -le
|
字符比较运算
1 2 3 4 5 6
| = 或 == != < > -z -n
|
逻辑运算符
1 2 3 4 5 6 7
| 用于 [] -a -o 用于 [[]] 或(()) && ` !
|
文件测试运算符
1 2 3 4 5 6 7 8 9 10
| -e -f -d -L -r -w -x -s file1 -nt file2 file1 -ot file2
|
位运算符
赋值运算
1 2 3 4 5 6 7 8 9 10
| = += -= *= /= %= <<= >>= &= ^=
|
整数判断/运算 |
(( )) |
字符串判断 |
[[ ]] (或 [ ] ) |
文件测试 |
[ ] |
组合条件(逻辑与或) |
[[ ]] |
循环控制
tips
变量不能紧贴判断符号[ ]
判断语句
if 语句
1 2 3 4 5 6 7
| if [ condition1 ]; then elif [condition2]; then else fi
|
switch语句
1 2 3 4 5 6 7 8 9 10 11
| case $变量 in 模式1) 命令1 ;; 模式2) 命令2 ;; *) 默认命令 ;; esac
|
循环语句
for语句
1 2 3
| for var in val1 val2 val3; do done
|
1 2 3
| for ((i=0; i<5; i++)); do echo $i done
|
while语句
until语句
break 中断并跳出当前循环
continue 跳过本次循环执行下一次循环
函数
函数声明
1 2 3 4
| function myfunc { echo "Hello from myfunc" }
|
或
1 2 3
| myfunc() { echo "Hello from myfunc" }
|
参数传入
Shell 函数不需要事先声明类型,调用时直接以空格分隔传递参数,函数内部用 $1、$2 等方式访问。
1 2 3 4 5 6
| greet() { echo "Hello, $1!" }
greet "Alice"
|
返回值
return
用于返回状态码(0~255),而 echo
用于将值输出给命令替换($(...)
)来接收。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| check_even() { if [ $(( $1 % 2 )) -eq 0 ]; then return 0 else return 1 fi }
check_even 4 echo $?
check_even2() { if [ $(( $1 % 2 )) -eq 0 ]; then echo "even" else echo "odd" fi }
res=$(check_even2 5) echo $res
|
局部变量
1 2 3 4 5 6 7 8
| myfunc() { local var="secret" echo "Inside: $var" } myfunc echo "Outside: $var"
|