常用的逻辑
输出内容到文件中
通过重定向方式将执行命令的输出到文件,替换文件中的已有内容>
cmd > file_path.txt
如果cmd执行失败,上面的情况是否不会写入文件,而是会在命令行控制台上打印报错信息,那么我们如果希望命令执行失败的结果也写入到目标文件中,那可以按照下面的方式来进行:
cmd> file_path.txt 2>&1
0代表标准输入,1代表标准输出,2代表标准错误。在这里,你要将标准错误(2) 重定向(&)到与标准输出(1)相同的地址。
通过重定向方式将执行命令的输出到文件,追加到文件已有内容后面>>
cmd >> file_path.txt
通过tee命令显示的将执行命令的输出到文件,替换文件中的已有内容
通过tee命令,除了达到重定向的效果,另外还是会继续在命令行的控制台上显示写入到文件中的内容。
cmd | tee file_path.txt
通过tee命令显示的将执行命令的输出到文件,追加到文件已有内容后面
cmd | tee -a file_path.txt
打印内容(输出内容到屏幕)
echo输出内容到控制台
echo "test"
判断文件是否存在的方法
if [ ! -f "$filename_path" ]; then
touch $filename_path
else
echo $filename_path
fi
-f filename_path //如果 filename_path为普通文件,值为true
-d filename_path //如果 filename_path为目录,值为true
-e filename_path //如果 filename_path存在,值为true
-L filename_path //如果 filename_path为符号链接,值为true
-r filename_path //如果 filename_path可读,值为true
-w filename_path //如果 filename_path可写,值为true
-x filename_path //如果 filename_path可执行,值为true
-s filename_path //如果文件长度不为0,值为true
-h filename_path //如果文件是软链接,值为true
清空文件内容
> $file_path
获取命令行传递的参数
sh xxx.sh aa bb cc
echo $# #参数个数:3
$1 #第1个参数 aa
$2 #第2个参数 bb
如何解决一个字符串内部的空格引起的逻辑处理问题?
灵活使用双引号进行解决。例如:
当i=0的时候,
a
u
t
h
o
r
l
i
s
t
[
i
]
的值是
S
t
e
p
h
a
n
e
N
i
c
o
l
l
,当希望它作为一个整体传递参数到其他地方,那么对它使用加上双引号的获取方式
"
{author_list[i]}的值是Stephane Nicoll,当希望它作为一个整体传递参数到其他地方,那么对它使用加上双引号的获取方式"
authorlist[i]的值是StephaneNicoll,当希望它作为一个整体传递参数到其他地方,那么对它使用加上双引号的获取方式"{author_list[i]}",如果这里直接使用${author_list[i]},Stephane Nicoll就变成了Stephane和Nicoll2个参数了。
author_list=("Stephane Nicoll" "Andy Wilkinson");
for ((i=0;i<${#author_list[@]};i++));do
echo ${author_list[i]}
write_to_file_of_author "${author_list[i]}"
done
if语句
if判断数值大小
if条件判断中的运算符如下:
-gt # 对应>
-lt # 对应<
-eq # 对应=
-ne #对应!=
-ge #对应>=
le #对应<=
样例:
after_date="2022-09-21"
until_date="2022-09-22"
save_file_path="/f/mytool"
echo $#
if [ $# -gt 1 ]; then
after_date=$1
until_date=$2
fi
echo $after_date
echo $until_date
变量
定义变量
var1="test";
echo $var1
判断变量
if [ "$var1" = "$var2" ]; then
echo '相等'
else
echo '不相等'
fi
变量中带有空格的时候,如何传递?
当i=0的时候, a u t h o r l i s t [ i ] 的值是 S t e p h a n e N i c o l l ,当希望它作为一个整体传递参数到其他地方,那么对它使用加上双引号的获取方式 " {author_list[i]}的值是Stephane Nicoll,当希望它作为一个整体传递参数到其他地方,那么对它使用加上双引号的获取方式" authorlist[i]的值是StephaneNicoll,当希望它作为一个整体传递参数到其他地方,那么对它使用加上双引号的获取方式"{author_list[i]}"
author_list=("Stephane Nicoll" "Andy Wilkinson");
for ((i=0;i<${#author_list[@]};i++));do
echo ${author_list[i]}
write_to_file_of_author "${author_list[i]}"
done
数组
定义数组
shell数组使用圆括号()包括起来具体的数组元素,另外数组元素之间使用空格分隔开,另外对于字符串类型,每个元素使用双引号"或者单引号’进行修饰。
语法:数组名=(元素1 元素2 元素3)
例如:
my_array=(1 2 3); #数字数组
my_array=("ab" "bc" "cd"); #字符串数组
访问数组中的某个元素
语法:${数组名[元素下标]}
my_array_item=${my_array[1]};
echo $my_array_item;
获取数组元素个数
语法:${#数组名[@/*]}
my_array_length=${#my_array[@]};
echo $my_array_length;
my_array_length=${#my_array[*]};
echo $my_array_length;
遍历数组
方式1:for语句方式for…each方式
for item in ${my_array[@]};do
echo $item;
done
方式2:for语句 数组下标循环访问方式
for ((i=0;i<${#my_array[@]};i++)); do
echo ${my_array[i]};
done
函数
定义函数
shell的函数是使用之前需要定义好。先定义后使用。
因此必须将函数的定义放在脚本的开头部分。
其他说明:
关于函数定义开头部分会有下面样例三种方式。
关于返回值,如果显示加了return语句,那么以return为准,如果没有加return语句,那么默认返回的是函数体中最后一个命令执行的运行的结果。范围是0-255的整数。
语法:
[ function ] funname [()]
{
action;
[return int;]
}
例如:可以是下面3种风格的定义方式。
function funname()
{
echo "do something";
return 0;
}
funname()
{
echo "do something";
return 0;
}
function funname
{
echo "do something";
}
调用函数
调用函数 不带入参
shell脚本中调用函数的方法较为直接,直接使用函数名称即可。
function funname
{
echo "do something";
}
funcname;
调用函数 带入参
如果需要调用函数的时候带入参,那么相应的在函数体中一般来说也会有对应的入参使用代码。
function funcname
{
echo "do something";
echo $#
echo $1
echo $9
echo ${10}
echo ${11}
}
funcname 1 2 3 4 5 6 7 8 9 10 11
在函数中使用外部调用传入的参数的方法为:
当n < 10, $n 或者 ${n}
当n>=10,
n
或者简单点,可以使用通用的方式
{n} 或者简单点,可以使用通用的方式
n或者简单点,可以使用通用的方式{n}的方式。
我们发现,有的时候如果使用$10,脚本编辑器自动会有不同的颜色显示,但是实际上也能执行成功$10。
参数处理 说明
$# 传递到脚本或函数的参数个数
$ 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
@
与
@ 与
@与*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。