1、编写一个shell脚本,当运行这个脚本的时候,会依次读取给予参数,然后运行。
1、shell脚本叫mul_param.sh
2、读取的数据放在一个txt文件里
- txt 文件里参数是 a|pass ,b|fail这种样式,我们要的入参就是|这个符号前面的a和b
3、每次读取的参数,通过xfu.sh 这个文件调用
4、把每次运行打印的结果保存在一个文件里。
#!/bin/bash
# 定义文件名
name_01="ccc.txt"
# 使用grep和awk提取包含"pass"的行,并打印第一个由'|'分隔的字段
is_pass() {
local file_name="$1"
grep "|pass" "$file_name" | awk -F'|' '{print $1}'
}
cat $name_01 | grep "pass|" >> 123.txt
echo '--------------------------------------' >> 123.txt
# 调用is_pass函数,并将结果逐行传递给xfu.sh脚本
line_list=$(is_pass " $name_01")
echo line_list_is $line_list
for line in $line_list; do
# echo $line
# 假设xfu.sh在当前目录下
./xfu.sh "$line"
# 检查上一个命令的返回值,如果非0则输出错误并退出
if [ $? -ne 0 ]; then
echo "Error executing xfu.sh with argument: $line"
exit 1
fi
done
# 脚本执行完成
exit 0
shell 常用
1、test if test a -lt b ; then 可以测试1、数值比较, 2、字符串比较 3、文件比较
数值比较是:e是等于 ,t 是不等于 。 g是大于, l是小于。 这两组可以匹配可以匹配。 n是不等于。
字符串比较是: = != < > -n(不为零为真) -z(为零为真)
文件比较是:-d ( 存在且是目录) -e ( 存在目录和文件都可以 ) -f( 存在且为文件) -r -w (存在,可读 ,可写) -s(存在且非空) -x(存在且可以执行)
file1 -nt file2 (文件1比文件2新) file1 -ot file2(文件1比文件2旧)
2、[ ] 是 代替test的,在if 语句中 ,可以不用写 test. if [ a -lt b ] , 注意点是,第一个括号之后, 和最后一个括号之前需要
有空格,否则会报错,比如[a-let b ]. [ ] 里可以使用简单的通配符。 比如 * 可以匹配零个或多个字符。 ?是单个字符
可以使用 [ condition1 ] || [ condition2 ] 来判断,
3、( ) 单括号, 单括号在执行前, 会创建一个子shell, 然后在里面执行命令, 成功则返回 状态码 0 . 只要进程中最后一个进程成功
则状态码是 0, 即使前面的进程是失败的。
$( )可以把命令的结果赋值给变量。
4、 (( expression )) 双括号,test命令使用的标准数学运算符,可以用在 if语句后, 也可以在脚本中的普通命令。 if (()); then (());fi;
双括号里可以直接用 i++, i–, ++i, --i, ! , **(幂运算) ,<< 左位移 >> 右位移, && 逻辑AND || 逻辑OR , & 布尔AND .
5 、[[ expression ]] 双方括号,可以使用test命令中,标准字符串比较。 还多加了 模式匹配, 即可以用通配符和正则表达式来匹配字符串。
6、(()) 用于执行数学运算,意思就是在里面是执行一个数学运算, 但是这个运算的结果并没有返回。
所以要想把结果赋值给别的变量需要 加上$ ,即var2= ( ( v a r 1 − 1 ) ) , 如果是自减,可以 v a r 1 = ((var1-1 )), 如果是自减 , 可以 var1= ((var1−1)),如果是自减,可以var1=((var1-1)) 或者 ((var1–))
如果给别人可以 result=$((var1-1)),