Shell 编程详细指南
什么是 Shell?
Shell 是用户与操作体系内核之间的接口,答应用户通过下令行输入来控制操作体系。它充当下令解释器,读取用户输入的下令并实行相应的操作。Shell 提供了强盛的脚本编程能力,可以自动化许多使命。常见的 Shell 有 Bash(Bourne Again Shell)、Zsh(Z Shell)、Ksh(Korn Shell)等。
什么是 Shell 脚本?
Shell 脚本是一种编程语言脚本,用于在 Unix/Linux 操作体系上实行下令。它是一系列下令的聚集,通常保存在一个文件中,可以通过运行脚本文件来实行这些下令。
1. 解释
单行解释
在 Shell 脚本中,解释是通过 # 字符来实现的。任何在 # 后面的内容都会被忽略,不会被实行。
- # 这是一个单行注释
- # echo "Hello, World!"
-
复制代码 文章下面讲的是shell是Bash的语法, 全部语法可以直接在终端使用, 也可以写在一个 .bash 或 .sh 的文件中, 然后通过 ./filename 来实行。(要想实行, 需要给文件可实行的权限, 下面会讲到)
文件开头先写上下面内容,
#!/bin/bash
是一种称为 “shebang” 或 “hashbang” 的特殊解释,用于指定脚本的解释器。
作用
- 指定解释器:#!/bin/bash
告诉操作体系这个脚本应该由 /bin/bash 程序来解释实行。/bin/bash 是 Bash(Bourne Again Shell)的路径。
- 实行权限:当你在 Unix/Linux 体系中运行一个脚本时,操作体系会根据这个 shebang 行来决定用哪个解释器来实行脚本内容。#!/bin/bash
使得脚本可以或许以 Bash 语言实行,即使脚本的扩展名不是 .sh。
2. 变量
变量定义与使用
在 Shell 中,变量的定义不需要使用数据范例。可以直接用 = 号赋值,不要在 = 号双方加空格。变量的值可以通过 $ 符号来引用。
- my_var="Hello, World!"
- echo $my_var
复制代码 变量命名规则
- 变量名只能包含字母、数字和下划线。
- 变量名不能以数字开头。
- 变量名通常使用大写字母以提高可读性(不是逼迫要求)。
变量范例
- name="John Doe"
- echo "Hello, $name"
复制代码- number=42
- echo "The number is $number"
复制代码 数组
数组赋值
- arr=(value1 value2 value3)
复制代码 读取数组元素
变量操作
变量更换
变量更换是指将变量的值插入到字符串中。
- echo "My name is ${name}."
复制代码 只读变量
定义只读变量后,其值不能被修改。
- readonly val="value"
- val="new_value" # 这将会报错
复制代码 3. 环境变量
环境变量是可以在整个体系中使用的变量。它们通常在 Shell 会话开始时定义,可以影响体系的行为和操作。常见的环境变量有 PATH、HOME、USER 等。
定义和导出环境变量
使用 export 下令可以将变量设置为环境变量。
- export MY_ENV_VAR="value"
复制代码 检察环境变量
使用 printenv 或 env 下令可以检察当前全部环境变量。
4. 常用 Shell 变量
- $0:当前脚本的文件名。
- $1, $2, …:通报给脚本或函数的参数。
- $#:通报给脚本或函数的参数个数。
- $@:通报给脚本或函数的全部参数。
- $?:上个下令的退出状态。
- $$:当前 Shell 进程的 PID。
- $!:背景运行的末了一个进程的 PID。
5. 输入输出
read 下令
read 下令用于从标准输入读取一行输入,并将其分配给一个或多个变量。
基本用法
- echo "Enter your name:"
- read name
- echo "Hello, $name!"
复制代码 使用选项
- -p 提示符
- -s 隐蔽输入(常用于暗码)
- -t 设置超时
- -n 限制输入字符数
- read -p "Enter your username: " username
- read -s -p "Enter your password: " password
- echo
- echo "Username: $username"
复制代码 echo 下令
echo 下令用于输出字符串到标准输出。
基本用法
使用选项
- echo -n "Hello, "
- echo "World!"
- echo -e "Line1\nLine2\nLine3"
复制代码 printf 下令
printf 下令用于格式化输出,雷同于 C 语言中的 printf 函数。
- printf "Hello, %s!\n" "World"
复制代码 常见格式说明符
- %s 字符串
- %d 十进制整数
- %f 浮点数
- %x 十六进制数
- name="John"
- age=25
- printf "Name: %s, Age: %d\n" "$name" "$age"
复制代码 6. 条件判定
判定语句
if 语句
- if [ condition ]; then
- # statements
- elif [ condition ]; then
- # statements
- else
- # statements
- fi
复制代码 样例:
- #!/bin/bash
- number=5# gt lt 分别是 > 和 <if [ $number -gt 0 ]; then echo "The number is positive."elif [ $number -lt 0 ]; then echo "The number is negative."else echo "The number is zero."fi
复制代码 case 语句
- case "$variable" in
- pattern1)
- # statements
- ;;
- pattern2)
- # statements
- ;;
- *)
- # default statements
- ;;
- esac
复制代码 样例:
- #!/bin/bash
- echo "Enter a single character (a-g):"read charcase "$char" in a) echo "Monday" ;; b) echo "Tuesday" ;; c) echo "Wednesday" ;; d) echo "Thursday" ;; e) echo "Friday" ;; f) echo "Saturday" ;; g) echo "Sunday" ;; *) echo "Invalid input" ;;esac
复制代码 test 下令
test 下令用于条件判定,常与逻辑运算符结合使用。
文件测试
- -e 文件存在
- -f 文件是平凡文件
- -d 文件是目次
- if test -e /etc/passwd; then
- echo "/etc/passwd exists."
- fi
复制代码 字符串测试
- -z 字符串为空
- -n 字符串非空
- = 字符串相称
- != 字符串不相称
- if test -z "$name"; then
- echo "Name is empty."
- fi
复制代码 数值测试
- -eq 即是
- -ne 不即是
- -gt 大于
- -lt 小于
- -ge 大于或即是
- -le 小于或即是
- if test $age -gt 20; then
- echo "Age is greater than 20."
- fi
复制代码 7. 循环语句
for 循环
- for var in list; do
- # statements
- done
复制代码- for i in {1..5}; do
- echo "Number: $i"
- done
复制代码 while 循环
- while [ condition ]; do
- # statements
- done
复制代码- counter=1
- while [ $counter -le 5 ]; do
- echo "Counter: $counter"
- counter=$((counter + 1))
- done
复制代码 until 循环
- until [ condition ]; do
- # statements
- done
复制代码- counter=1
- until [ $counter -gt 5]; do
- echo "Counter: $counter"
- counter=$((counter + 1))
- done
复制代码 8. 函数
Shell 函数用于封装代码块,以便多次调用。
定义函数
- function_name() {
- # statements
- }
复制代码- greet() {
- echo "Hello, $1!"
- }
- greet "World"
复制代码 带返回值的函数
- add() {
- result=$(( $1 + $2 ))
- return $result
- }
- add 2 3
- echo "Sum: $?"
复制代码 综合示例
- #!/bin/bash
- # 函数定义print_menu() { echo "1. Say Hello" echo "2. Display Date" echo "3. Exit"}# 主程序while true; do print_menu read -p "Enter your choice: " choice case $choice in 1) read -p "Enter your name: " name echo "Hello, $name!" ;; 2) current_date=$(date) echo "Current date and time: $current_date" ;; 3) echo "Goodbye!" break ;; *) echo "Invalid choice, please try again." ;; esacdone
复制代码 结论
上述内容涵盖了 Shell 脚本编程中的基础部门,包括输入输出、变量和函数、条件判定和循环等。通过理解和掌握这些内容,你可以编写功能强盛的 Shell 脚原来
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |