redirect到在bash中存储awk的variables

cat list.txt 

1 apple 4 30 f 2 potato 2 40 v 3 orange 5 10 f 4 grapes 10 8 f

脚本:getlist ::

 if [[ "$@" == *[f]* ]] ; then awkv1 = $(grep f | awk '{ print $2 $3 }') else awkv1 = $(awk '{ print $2 $4 $5 }') fi cat list.txt | $(awkv1) 

我有一个variablesawkv1存储值取决于参数'f'。 但它不工作。 Running :: getlist f不会执行任何操作。

它应该像这样工作::如果在参数中传递了'f',那么:: cat list.txt | grep f | awk '{ print $2 $3 }' cat list.txt | grep f | awk '{ print $2 $3 }'

否则: cat list.txt | awk '{ print $2 $4 $5 }' cat list.txt | awk '{ print $2 $4 $5 }'

将部分命令行存储在字符串变量中更容易出错,使用bash数组更好。

你可以像这样调整脚本:

 #!/bin/bash # store awk command line in an array if [[ "$*" == *f* ]]; then awkcmd=(awk '/f/{ print $2, $3 }') else awkcmd=(awk '{ print $2, $4, $5 }') fi # execute your awk command "${awkcmd[@]}" list.txt 

您需要在脚本中执行一些更正:

  1. 删除awkv1 = $空格
  2. 而不是grep f使用grep 'f$' 。 这种方法仅在最后一列中匹配字符f ,并避免带有字母f果实,例如fig ,在最后一列以v.结尾时匹配v.
  3. 替换cat list.txt | $(awkv1) cat list.txt | $(awkv1) by echo "$awkv1"因为前一个命令的输出已存储在变量$awkv1

脚本的更正版本:

 if [[ "$@" == *[f]* ]] ; then awkv1=$(grep 'f$' | awk '{ print $2, $3 }') else awkv1=$(awk '{ print $2, $4, $5 }') fi echo "$awkv1" 

你可以这样调用这个脚本: cat list.txt | getlist f cat list.txt | getlist f

为什么不只是做这样的事情:

文件: getlist

 #!/bin/sh if [ "$1" = "f" ]; then awk '$5=="f"{print $2,$3}' list.txt else awk '{print $2,$4,$5}' list.txt fi 

如果这个文件是可执行的,你可以这样调用它:

 $ ./getlist f apple 4 orange 5 grapes 10 $ ./getlist apple 30 f potato 40 v orange 10 f grapes 8 f $ 

或者,如果您要在命令行中指定搜索值:

 #!/bin/sh if [ "$1" ]; then awk -vt="$1" '$5==t{print $2,$3}' list.txt else awk '{print $2,$4,$5}' list.txt fi 

这样,您可以列出标有fv字段:

 $ ./getlist apple 30 f potato 40 v orange 10 f grapes 8 f $ ./getlist f apple 4 orange 5 grapes 10 $ ./getlist v potato 2 $