文章目录
一. while和IFS和echo
1. 尽量像这样将IFS放到while内部,让IFS只在while循环中生效,避免干扰其他地方
while IFS=“,” read -r year round winner opponent winner_goals opponent_goals
2. 在不设置IFS的情况下,使用BAR可以让|作为分隔符
while read BIKE_ID BAR TYPE BAR SIZE
do
echo "$BIKE_ID $TYPE $SIZE"
done
3. 当你使用管道 (|) 时,管道的每一端都会在一个单独的子Shell中运行,所做的操作不能影响当前shell环境
通过管道(|)、命令替换 $()、或括号 (command)执行的命令会创建子Shell,管道的两端,括号中的部分都是在子shell运行
echo $RES | while IFS='|' read -r A B C
do
echo $A $B $C
done
echo $A $B $C
循环里会进入子脚本环境有输出,但是循环外的echo输出为空,因为修改的是子shell。
解决方法:
1.使用<<<, read -r A B C <<< $RES,可以操作父shell
2. 使用echo $RES > a.txt,然后
cat a.txt | while IFS='|' read -r A B C
do
echo $A $B $C
done
echo $A $B $C
4.echo和<<<对数据处理的不同
(1) echo
VAR=1 \n 2\n
echo $VAR输出1 2,echo 在没有特殊处理的情况下会将所有内容作为单行输出,因此所有的结果会被合并到一行,用空格分隔。
如果想换行输出则可以考虑使用tr或sed命令将空格替换为\n
(2) <<<
<<< 会保留换行符输出
二.多行注释
: ’ for (( i = $1; i >= 0; i-- )) 注意:和’之间有一个空格
do
echo $i
sleep 1
done
’
三.echo和cat
echo $PSQL “SELECT service_id, name FROM services ORDER BY service_id” | cat
1.echo只会输出字符串,意思就是说给echo的参数只能是字符串,如下
echo a.txt
// 不会输出a.txt文件
echo $PSQL “SELECT service_id, name FROM services ORDER BY service_id”
//只会输出$PSQL “SELECT service_id, name FROM services ORDER BY service_id”,而不会去执行这条命令
echo $($PSQL “SELECT service_id, name FROM services ORDER BY service_id” ).要想输出执行命令的结果只能像这样将命令的结果用$包装为字符串然后echo,类似与echo $(ls)
cat必须接受文件参数,而不能接受字符串,如下
cat < 123 //错误
echo 123 | cat 正确 //因为|管道会自动把字符串包装为一个文件