另外,还有几个特殊字符用来处理参数:

参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
如”$*”用「”」括起来的情况、以”$1 $2 … $n”的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
如”$@”用「”」括起来的情况、以”$1” “$2” … “$n” 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
实例
#!/bin/bash

author:菜鸟教程

url:www.runoob.com

echo “Shell 传递参数实例!”;
echo “第一个参数为:$1”;

echo “参数个数为:$#”;
echo “传递的参数作为一个字符串显示:$*”;
执行脚本,输出结果如下所示:

$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3
$* 与 $@ 区别:

相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 “ * “ 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。


1
2
3
4
5
6
if [ $a == $b ]
then


-a <===> && (逻辑运算符) -a与 -0 或 !非
-0 <===> ||

test命令包含以下文件操作运算符,这些运算符允许你测试不同类型的文件:

-b FILE - 如果文件存在并且是块特殊文件,则为True。
-c FILE - 如果文件存在并且是特殊字符文件,则为True。
-d FILE - 如果文件存在并且是目录,则为True。
-e FILE - 如果文件存在并且是文件,则为True,而不考虑类型(节点、目录、套接字等)。
-f FILE - 如果文件存在并且是常规文件(不是目录或设备),则为True。
-G FILE - 如果文件存在并且与运行命令的用户具有相同的组,则为True。
-h FILE - 如果文件存在并且是符号链接,则为True。
-g FILE - 如果文件存在并已设置组id(sgid)标志,则为True。
-k FILE - 如果文件存在并设置了粘滞位标志,则为True。
-L FILE - 如果文件存在并且是符号链接,则为True。
-O FILE - 如果文件存在并且由运行该命令的用户拥有,则为True。
-p FILE - 如果文件存在并且是管道,则为True。
-r FILE - 如果文件存在且可读,则为True。
-S FILE - 如果文件存在并且是套接字,则为True。
-s FILE - 如果文件存在且大小不为零,则为True。
-u FILE - 如果文件存在并且设置了(suid)标志,则为True。

判断字符串是否为空

[[ -z $str ]] : 如果str为空串,则返回真

[[ -n $str ]] :如果str不为空,则返回真

1
这里输入代码

使用逻辑运算符&& 和 || 能够很容易将多个判断条件组合起来:



1、 “ >/dev/null 2>&1 & “常用来避免shell命令或者程序等运行中有内容输出。

这条命令的意思就是在后台执行这个程序,并将错误输出2重定向到标准输出1,然后将标准输出1全部放到/dev/null文件,也就是清空.

0:表示键盘输入(stdin)
1:表示标准输出(stdout),系统默认是1
2:表示错误输出(stderr)
command >/dev/null 2>&1 & == command 1>/dev/null 2>&1 &
1)command:表示shell命令或者为一个可执行程序
2)>:表示重定向到哪里
3)/dev/null:表示Linux的空设备文件
4)2:表示标准错误输出
5)&1:&表示等同于的意思,2>&1,表示2的输出重定向等于于1
6)&:表示后台执行,即这条指令执行在后台运行
1>/dev/null:表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,不显示任何信息。
2>&1:表示标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

2、两者都可以把find命令查找到的结果删除,(find ./ -exec rm {} ; # find ./ | xargs rm -rf)

其区别简单的说是前者是把find发现的结果一次性传给exec选项,这样当文件数量较多的时候,就可能会出现“参数太多”之类的错误,相比较而言,后者就可以避免这个错误,因为xargs命令会分批次的处理结果。这样看来,“find ./| xargs rm -rf”是更通用的方法,推荐使用!


3、-type f,表示只找file,文件类型的,目录和其他字节啥的不要


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#shell变量的截取

Shell中的${}、##和%%
假设定义了一个变量为:
代码如下:
file=/dir1/dir2/dir3/my.file.txt
//变量的删除
可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 . 及其左边的字符串:file.txt
${file##*.}:删掉最后一个 . 及其左边的字符串:txt
${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)
${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
//变量的替换
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt

${LINE%%*}的意思就是从LINE这个变量的值中,从后面开始以最长匹配删去%%后面的表达式内容。
看一下man bash可以找到详细说明,查找Parameter Expansion这段会看到:
${parameter%word}
${parameter%%word}
都是从parameter的最后开始删除word所匹配的内容,%是最短匹配,%%是最长匹配。

shift 位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1

位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1$2$3丢弃,$0不移动。不带参数的shift命令相当于shift 1

非常有用的 Unix 命令:shift。我们知道,对于位置变量或命令行参数,其个数必须是确定的,或者当 Shell 程序不知道其个数时,可以把所有参数一起赋值给变量$*。若用户要求 Shell 在不知道位置变量个数的情况下,还能逐个的把参数一一处理,也就是在 $1 后为 $2,在 $2 后面为 $3 等。在 shift 命令执行前变量 $1 的值在 shift 命令执行后就不可用了。

记录log的方法

1
2
3
4
5
6
7
8
9
# 定义 log 函数
function log() {
local message="$1"
local log_file="${APPFORM_TOP}/logs/checkAiServiceStatus.log" # 替换为实际的日志文件路径
timestamp=$(date +"%Y-%m-%d %H:%M:%S")

# 将日志消息写入日志文件
echo "[${timestamp}] $message" >> "$log_file"
}