Linux.Shell Scirpt.基本够用的操作

本文介绍了Linux Shell Script的基础知识,包括选择Shell(如bash)、变量、数组、脚本参数、基本数学运算、条件判断和控制流结构。还讲解了字符串操作、函数、实用小技巧,如括号的不同用法、实时显示、参数处理等,帮助读者掌握编写简单Shell脚本的技能。

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

基本够用的 Shell Script 语法

选择 Shell

在 Shell 脚本的第一行设置,如下选择 bash 来运行

#!/bin/bash

Linux 中的 Shell 有多种,常见有以下:

  • Bourne Shell(sh),是 UNIX 最初使用的 Shell,在不同 UNIX 下均能使用。
    • sh 在 Shell 编程上非常好用,但在与用户的交互上不如其他。
  • Bourne Again Shell(bash),是 Linux 系统默认的shell,基于 sh 扩展而来,与 sh 兼容。
    • 相对于 sh,bash 增加了许多特性,如命令行补全、命令行编辑、命令历史表等
  • C Shell(csh)是一种比 sh 更适合于编程的 Shell,语法和 C 语言很相似。
    • Tcsh 是 Linux 为喜欢使用 csh 的人提供的,是 csh 的一个扩展版本。
  • Korn Shell(ksh) 集合了 csh 和 sh 的优点,并且与 sh 完全兼容。
    • pdksh 是 Linux 提供的基于 ksh 扩展的一种 Shell,支持了任务控制,可以挂起、后台执行、唤醒、终止。
  • Almquist shell(ash)是一个轻量级的 Unix Shell,诞生于 1980s,最初是 bash 的一个克隆版本,后来在 1990s 时 ash 取代 bash 成为 BSD 系的 Unix 的默认 Shell
  • Z Shell(zsh)有着很多灵活的特性,更适合与人交互,在 2019 年苹果 WWDC 发布会上,zsh 已经取代 bash 成为 Mac 的默认 Shell
    • 著名的 Github 项目 oh-my-zsh 已经基本成为若干程序员的标配了

以下语法均以bash为主要背景,大多数 Shell 如 zsh 基本上都与bash兼容

变量

VAR_NAME=“var value”

$ cat test.sh
VAR="asd"
echo ${VAR}
$ ./test.sh
asd

数组

bash 仅支持一维数组,元素以空格为区分。若一个元素包含空格,则应使用单引号或双引号将这个元素围起来。

$ cat test.sh
array=(qwe asd "zx c")
echo ${array[0]}
echo ${array[1]}
echo ${array[2]}
array[0]=QWE
echo ${array[0]}

$ ./test.sh
qwe
asd
zx c
QWE

常用的针对数组的操作:

  • ${array[*]}获取数组的所有元素
  • ${#array[*]}${#array[@]}获取数组元素个数
  • array[i]=value设置第i个元素的值

脚本的参数

通过$0来获取第 0 个参数,$1来获取第 1 个参数,以此类推

  • $#代表参数个数
  • $*代表所有参数,用一整个字符串表示
  • $@代表所有参数,用每个参数表示
  • $$代表运行脚本的当前进程 ID 号
  • $?代表最后命令的退出状态,0表示没有错误,非0表示有错误
  • $!代表后台运行的最后一个进程的 ID 号
$ cat test.sh
echo $1
echo $2
echo $#
$ ./test.sh arg1 arg2
arg1
arg2
2

$*$@均代表所有参数,区别在于前者将所有参数组合成一个字符串,后者仍是分离的每个参数。

$ cat test.sh
echo $#
echo "------"
for arg in "$*"
do
    echo ${arg}
done
echo "------"
for arg in "$@"
do
    echo ${arg}
done

$ ./test.sh arg1 arg2
2
------
arg1 arg2
------
arg1
arg2

对于参数arg1 arg2:

  • $*的背后含义是"arg1 arg2"
  • $@的背后含义是"arg1" "arg2"

但是!如果不用双引号将$*$@围起来的话,二者仅有的这点区别似乎就没了

$ cat test.sh
echo $#
echo "------"
for arg in $*
do
    echo ${arg}
done
echo "------"
for arg in $@
do
    echo ${arg}
done

$ ./test.sh arg1 arg2
2
------
arg1
arg2
------
arg1
arg2

基本数学运算

expr命令支持加、减、乘、除、取余,均针对有符号整数运算。

  • 乘法需要用\进行转义,即\*表示乘法
    • *代表当前工作目录下的所有文件,可用$(pwd)来获取当前工作目录
$ cat test.sh
a=52
b=10
echo $a + $b = `expr $a + $b`
echo $a - $b = `expr $a - $b`
echo $a \* $b = `expr $a \* $b`
echo $a / $b = `expr $a / $b`
echo $a % $b = `expr $a % $b`

$ ./test.sh
52 + 10 = 62
52 - 10 = 42
52 * 10 = 520
52 / 10 = 5
52 % 10 = 2

也可以使用(())来完成运算,基本使用方式是$(( expressiong ))

$ cat test.sh
a=52
b=10
echo $a + $b = $(($a + $b))
echo $a - $b = $(($a - $b))
echo $a \* $b = $(($a * $b))
echo $a / $b = $(($a / $b))
echo $a % $b = $(($a % $b))

$ ./test.sh
52 + 10 = 62
52 - 10 = 42
52 * 10 = 520
52 / 10 = 5
52 % 10 = 2

条件判断

条件运算位于[]中,并有空格隔开。主要有三类:

  • 数字
  • 字符串
  • 文件

数字条件判断

  • -eq判断是否相等,相等则返回true,等同于==
  • -ne判断是否不等,不等则返回true,等同于!=
  • -gt判断是否大于,若左边大于右边则返回true
  • -lt判断是否小于,若左边小于右边则返回true
  • -ge判断是否大于等于,若是则返回true
  • -le判断是否小于等于,若是则返回true
  • -a进行逻辑与操作,若两个条件都满足则返回true
  • -o进行逻辑或运算,若至少一个条件满足则返回true
$ cat test.sh
a=1
b=2
if [ $a -lt $b ]; then
    echo "$a < $b"
else
    if [ $a -eq $b ]; then
        echo "$a = $b"
    else
        echo "$a > $b"
    fi
fi
if [ $a -eq 1 -a $b -eq 2 ]; then
    echo "a=1 & b=2"
else
    echo "a!=1 or b!=2"
fi
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值