shell笔记

本文介绍Shell脚本的基础知识,包括脚本的编写、执行及放置位置等。详细讲解了脚本的基本格式、常量与变量的使用、数组操作、读取键盘输入的方法,以及程序流程控制等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shell编程笔记

什么是 Shell 脚本?
最简单的解释,一个 shell 脚本就是一个包含一系列命令的文件。
怎样编写一个 Shell 脚本?
1. 编写一个脚本。
2. 使脚本文件可执行。(chmod,权限为 755 的脚本,则每个人都能执行,和权限为 700 的脚本,只有文件所有者能够执行。)
3. 把脚本放置到 shell 能够找到的地方。

基本格式

#!/bin/bash         【①:第一行 #!/bin/bash 在宣告这个 script 使用的 shell 名称】
# 2016/12/14  Tim  helloWorld script    【②:脚本内容的说明(#注释)】
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin  
export PATH     【③:主要环境变量的宣告(export:导出环境变量,让随后执行的程序知道)】
echo -e "Hello World! \a \n"    【④:脚本主要内容(echo -e 处理转义字符,如:\a 响铃(“警告” -导致计算机嘟嘟响);\n 换行。】
exit 0      【⑤:执行成果告知 (定义回传值)】

常量与变量

常量

定义:declare -r sum    (将变量设定成为 readonly 类型,该变量不可被更改内容,也不能 unset)

变量

全局变量

定义:variable=value
使用:$variable  或  ${variable}

局部变量

定义:local foo(局部变量)

数组

定义:declare  -a  a   或   a[1]=foo (使用 -a 选项,declare 命令的这个例子创建了数组 a。)
单个赋值:name[subscript]=value
多个赋值:name=(value1 value2 …)
访问:$ hours
长度:数组长度:${#a[@]};指定数组长度:${#a[100]}

读取键盘收入

read:从标准输入读取数值。

read [-options] [variable...]

read选项
选项          说明
-p prompt       为输入显示提示信息,使用字符串 prompt。
-t seconds      超时. 几秒钟后终止输入。read 会返回一个非零退出状态,若输入超时。
-a array        把输入赋值到数组 array 中。
-d delimiter    用字符串 delimiter 中的第一个字符指示输入结束,而不是一个换行符。
-e              使用 Readline 来处理输入。这使得与命令行相同的方式编辑输入。
-n num          读取 num 个输入字符,而不是整行。
-r              Raw mode. 不把反斜杠字符解释为转义字符。
-s              Silent mode. 不会在屏幕上显示输入的字符。当输入密码和其它确认信息的时候,这会很有帮助。
-u fd           使用文件描述符 fd 中的输入,而不是标准输入。

shell参数

用$1,$2..分别得到第1,第2..个参数。

程序流程控制

表达式

文件表达式

整型表达式

字符串表达式

逻辑表达式

这里写图片描述

选择判断结构

if 分支结构
if 语句语法:
    if [ 条件判断式 ]; then
        commands
    elif [ 条件判断式 ]; then
        commands...
    else
        commands
    fi


例:
    if [ $x = 5 ]; (注意空格和分号)
        then echo "x equals 5."
    else echo "x does not equal 5."
    fi
与if常用的判断式结构描述
test expression相当于if, 可用 ‘$?’ 或 ‘&&’ 及 ‘||’ 来展现整个结果。
[ expression ]与test命令功能一样。
(( expression ))为整数设计,支持一套完整的算术计算。
[[ expression ]]强化的[],里面可以用正则表达式。(string1 =~ regex)
case 分支结构
case多选语法:
    case $变量名 in
        [pattern [| pattern]...) commands ;;]...
        *)
            程序段(最后一个变量内容都会用 * 来代表所有其他值。)
            exit 1
            ;;
    esac

例:  
    #1. Display System Information  
    #2. Display Disk Space  
    #3. Display Home Space Utilization  
    #0. Quit  
    case $REPLY in  
        0) echo "Program terminated."
            exit
            ;;
        1) echo "Hostname: $HOSTNAME"
            uptime
            ;;
        2) df -h
            ;;
        3) if [[ $(id -u) -eq 0 ]]; then
            echo "Home Space Utilization (All Users)"
            du -sh /home/*
        else
            echo "Home Space Utilization ($USER)"
            du -sh $HOME
        fi
        ;;
        *) echo "Invalid entry" >&2
        exit 1
        ;;
    esac
模式(一个“)”为终止符)描述
a)若单词为“a”,则匹配
[[:alpha:]])若单词是一个字母字符,则匹配
???)若单词只有 3 个字符,则匹配
*.txt)若单词以“.txt”字符结尾,则匹配
*)匹配任意单词。把这个模式做为 case 命令的最后一个模式,是一个很好的做法,可以捕捉到任意一个与先前模式不匹配的数值;也就是说,捕捉到任何可能的无效值。

执行多个动作

添加的“;;&”的语法允许 case 语句继续执行下一条测试,而不是简单地终止运行。

循环结构

while或until 循环结构
while/until 循环语法:
    while/until [ 条件判断式 ]; 
    do 
        commands
    done

例:
    # while-count: display a series of numbers
    count=1     
    while [ $count -le 5 ]; 
    do
        echo $count
        count=$((count + 1))
    done
for 循环结构
for语法: 传统 shell 格式(循环word2..次)
    for variable in word1 word2...; 
    do
        commands
    done

例:
    for i in {A..D}; 
    do 
        echo $i
    done

for语法: C 语言格式
    for (( 初始化表达式;;  循环条件表达式;;  循环后的操作表达式 )); 
    do
        commands
    done

例:
    for (( i=0; i<5; i=i+1 )); 
    do
        echo $i
    done

跳转结构

break

break命令立即终止一个循环,且程序继续执行循环之后的语句

continue

continue 命令导致程序跳过循环中剩余的语句,且程序继续执行下一次循环。

方法

function语法
    function fname(){
        程序段
    }

例:
    function hello() {
         echo -n "hello!"  #加上 -n 可以不断行继续在同一行显示
    }

疑难排解

vi/vim编辑器辅助 :syntax on (语法高亮生效)

追踪

全局:#!/bin/bash -x
局部:set -x 开启,set +x 关闭。

set -x # Turn on tracing
if [ $number = 1 ]; then
    echo "Number is equal to 1."
else
    echo "Number is not equal to 1."
fi
set +x # Turn off tracing
我们使用 set 命令加上 -x 选项来启动追踪,+x 选项关闭追踪。这种技术可以用来检查一个有错误的脚本的多个部分。

sh命令

sh  [-nvx]  scripts.sh
选项与参数:
-n :不要执行 script,仅查询语法的问题;
-v :再执行 sccript 前,先将 scripts 的内容输出到屏幕上;
-x :将使用到的 script 内容显示到屏幕上,这是很有用的参数!

### 超哥 Shell 编程笔记与教程 超哥的 Shell 编程笔记主要聚焦于基础概念、特殊变量以及子串操作等内容[^1]。以下是一些关键点: #### 一、Shell 编程基础 在 Shell 编程中,特殊变量是理解脚本逻辑的核心部分之一。例如 `$0` 表示脚本名称,`$1` 到 `$n` 表示传递给脚本的参数,而 `$$` 则表示当前进程的 PID[^3]。 #### 二、子壳(Subshell)行为 子壳的行为需要注意,其内部定义的变量无法被父壳访问。此外,当退出子壳时,会按照嵌套层次逐步退出,类似于嵌套的 `for` 循环结构中的 `break` 操作[^2]。 #### 三、循环控制语句 以一个简单的 `for` 循环为例,可以使用 `continue` 或 `break` 来控制循环流程。例如,在下面的代码中,当变量 `i` 等于 4 时,跳过当前循环并继续执行下一次循环: ```bash #!/bin/bash # 演示 continue 的用法 for (( i=1; i<=10; i=i+1 )) # 循环十次 do if [ "$i" -eq 4 ]; then # 如果变量 i 的值等于 4 continue # 跳过本次循环 fi echo $i # 输出变量 i 的值 done ``` 上述代码展示了如何通过条件判断来改变循环的行为[^3]。 #### 四、文件遍历 在实际应用中,Shell 脚本常用于文件或目录的遍历操作。以下是一个遍历指定路径下的文件并输出其路径的示例: ```bash #!/bin/bash # 遍历 /home/user 开头的路径 for file in /home/user* do if [ -f "$file" ]; then # 判断是否为文件 echo "File: $file" elif [ -d "$file" ]; then # 判断是否为目录 echo "Directory: $file" fi done ``` 这段代码结合了 `-f` 和 `-d` 测试选项,分别检查变量 `$file` 是否为文件或目录[^4]。 #### 五、系统命令集成 如果需要将脚本作为系统命令运行,可以将其放置在系统的可执行路径中(如 `/bin` 或 `/sbin` 目录)。这样可以通过简单的命令名直接调用脚本[^2]。 ### 总结 超哥的 Shell 编程笔记提供了从基础到实践的全面指导,包括特殊变量、子壳行为、循环控制以及文件遍历等内容。这些知识点对于初学者和进阶用户都具有很高的参考价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值