shell技巧

一. 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 正确 //因为|管道会自动把字符串包装为一个文件

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值