shell脚本基本常识

什么是 Shell?
Shell 是用户与操作系统内核之间的接口,允许用户通过命令行输入来控制操作系统。它充当命令解释器,读取用户输入的命令并执行相应的操作。Shell 提供了强大的脚本编程能力,可以自动化许多任务。常见的 Shell 有 Bash(Bourne Again Shell)、Zsh(Z Shell)、Ksh(Korn Shell)等。

什么是 Shell 脚本?
Shell 脚本是一种编程语言脚本,用于在 Unix/Linux 操作系统上执行命令。它是一系列命令的集合,通常保存在一个文件中,可以通过运行脚本文件来执行这些命令。

脚本运行方式
bash sh 和路径的方式执行是相同的,都是在子shell中执行
执行流程: bash test.sh 系统会启动一个子shell执行脚本,执行完成后子shell退出
source和.执行都是在父shell中执行,不会产生子shell

1. 注释
单行注释
在 Shell 脚本中,注释是通过 # 字符来实现的。任何在 # 后面的内容都会被忽略,不会被执行。
这是一个注释
echo "Hello, World!"

#!/bin/bash
#!/bin/bash 是一种称为 "shebang" 或 "hashbang" 的特殊注释,用于指定脚本的解释器。

作用
指定解释器:#!/bin/bash 告诉操作系统这个脚本应该由 /bin/bash 程序来解释执行。/bin/bash 是 Bash(Bourne Again Shell)的路径。

执行权限:当你在 Unix/Linux 系统中运行一个脚本时,操作系统会根据这个 shebang 行(#!)来决定用哪个解释器来执行脚本内容。
/bin/bash 使得脚本能够以 Bash 语言执行,即使脚本的扩展名不是 .sh。

2. 变量
系统变量: 系统定义好的变量 env 称为全局环境变量 类似国家法律
普通变量: 个人自定义的变量 shell脚本中定义 系统中定义的有LANG PATH PS1 称为局部环境变量 类似家规
变量名的规范要求字母、数字和下划线的组合,必须以下划线和字母开头,不能以数字开头。
等号两端不允许有空格
名称见名知其意
名字尽量避开系统命令
可以全大写 NAME USER PATH LANG
可以全小写 name age conut test(系统命令)
大驼峰语法 Name_Age=
小驼峰语法 name_Age=
咋写都行。尽量使用一种
[root@shell:~]#name=oldboy
[root@shell:~]#_name=oldboy
[root@shell:~]#echo $_name
oldboy
[root@shell:~]#1name=oldboy
-bash: 1name=oldboy: command not found
[root@shell:~]#name= oldboy
-bash: oldboy: command not found
[root@shell:~]#name =oldboy
-bash: name: command not found
[root@shell:~]#name = oldboy
-bash: name: command not found
数组
数组赋值

arr=(value1 value2 value3)
读取数组元素

echo ${arr[1]}
变量操作
变量替换

变量替换是指将变量的值插入到字符串中。

echo "My name is ${name}."
只读变量

定义只读变量后,其值不能被修改。

readonly val="value"
val="new_value" # 这将会报错
3.安装生存周期分类

永久变量: 一直存在系统   写入/etc/profile
临时变量: 退出系统没有了 直接在当前命令行定义 重启或者重新连接失效

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 "Hello, World!"
使用选项
-n 不换行
-e 解析反斜杠转义字符
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 char
 
case "$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."
      ;;
  esac
done

具体参考 https://ejf38e82b2.feishu.cn/docx/S3T2d987uoSnmxx3GnscaPGfnCh

posted on 2025-05-11 15:25  小二jerry  阅读(68)  评论(0)    收藏  举报