Shell 编程
常用命令
read、expr、tput 等都是 Linux 系统上的外部命令,可以在各种 Shell 脚本中调用。
read
read 从标准输入读取一行并赋值给变量。支持多个选项控制读取行为。
常用选项:-p "prompt" # 显示提示信息-s # 静默模式,不显示输入-t seconds # 超时时间-n chars # 读取指定字符数后返回
read var# 将读入的全部数据赋给 varread var1 var2 var3# 第一个参数赋给 var1,第二个赋给 var2,其余参数赋给最后一个变量read -p "Enter your name: " nameecho "Hello, $name"如果执行 read 时标准输入无数据,程序会等待数据输入或被终止。
示例:$ read name age[stdin] yilan 23$ echo "student $name is $age years old"[stdout] student yilan is 23 years old
tput
tput (terminal put) 用于终端控制,可以设置光标位置、颜色、清屏等。它与终端控制代码数据库 terminfo 相连,根据 TERM 环境变量值读取相应终端的控制代码。
常用功能:tput clear # 清屏tput cup row col # 移动光标到指定位置tput bold # 粗体文本tput smso # 启动突出显示tput rmso # 结束突出显示tput sgr0 # 重置所有属性tput cols # 输出终端列数tput lines # 输出终端行数
Bash 语法
常用系统变量
$0 # 当前 shell 程序的名字$1-$9 # 命令行上的第一到第九个参数$# # 命令行上的参数个数(不包含 $0)$* # 命令行上的所有参数$@ # 分别用双引号引用命令行上的所有参数$$ # 当前进程的进程标识号 (PID)$? # 上一条命令的退出状态$! # 最后一个后台进程的进程标识号Bash 特殊字符
Bash 中使用多种括号和特殊字符,理解它们的含义和用法非常重要。
命令替换
`command` # 反撇号,引用命令的运行结果$(command) # $() 语法,功能与反撇号相同,更推荐使用条件测试
[ string ] # 传统条件测试,两侧必须保留空格[[ string ]] # Bash 扩展条件测试,两侧保留空格,支持模式匹配算术运算
(( expr )) # 算术运算,无需转义 * 和 /分组与代码块
(command) # 在子 shell 中执行{ command; } # 在当前 shell 中执行,command 后的分号和空格不可省略条件判断
注意: [ condition ] 中的方括号两侧必须保留空格,否则条件测试无法正确执行。
if、else 和 elif 的基本语法:
if [ condition ]; then # 条件为真时执行的代码fiif [ condition ]; then # 条件为真时执行的代码else # 条件为假时执行的代码fiif [ condition1 ]; then # condition1 为真时执行elif [ condition2 ]; then # condition1 为假但 condition2 为真时执行else # 所有条件都为假时执行fi字符串测试
-z STRING # 如果字符串为空,则为真-n STRING # 如果字符串不为空,则为真STRING1 = STRING2 # 如果两个字符串相等,则为真STRING1 != STRING2 # 如果两个字符串不相等,则为真数值比较
NUM1 -eq NUM2 # 如果两个数字相等,则为真NUM1 -ne NUM2 # 如果两个数字不相等,则为真NUM1 -gt NUM2 # 如果 NUM1 大于 NUM2,则为真NUM1 -ge NUM2 # 如果 NUM1 大于或等于 NUM2,则为真NUM1 -lt NUM2 # 如果 NUM1 小于 NUM2,则为真NUM1 -le NUM2 # 如果 NUM1 小于或等于 NUM2,则为真[[ $string =~ regex ]] # 如果字符串匹配正则表达式,则为真文件测试
-e FILE # 如果文件存在,则为真-f FILE # 如果文件存在且是普通文件,则为真-d FILE # 如果文件存在且是目录,则为真-r FILE # 如果文件存在且可读,则为真-w FILE # 如果文件存在且可写,则为真-x FILE # 如果文件存在且可执行,则为真逻辑运算符
&& # 逻辑与|| # 逻辑或循环语句
for (( counter=1; counter<=5; counter++ ))do echo "Welcome, this is iteration number $counter."donecounter=0# 循环直到用户输入的数字等于 5while [ $counter -ne 5 ]; do echo "Enter a number (current count: $counter)" read input_number # 检查输入是否为数字 if ! [[ "$input_number" =~ ^[0-9]+$ ]]; then echo "Error: Please enter a valid number." continue # 如果输入无效,跳过当前循环的剩余部分 fi # 将输入的数字赋值给计数器 counter=$input_number # 打印当前计数器的值 echo "You entered: $counter"doneecho "Enter a number between 1 and 3:"read numbercase $number in 1) echo "You entered one.";; 2) echo "You entered two.";; 3) echo "You entered three.";; *) echo "You did not enter a number between 1 and 3.";;esacShell 编程

