如何将文件中的行传递到 bash 脚本,以便即使有空格,每一行也保持不分隔?

如何将文件中的行传递到 bash 脚本,以便即使有空格,每一行也保持不分隔?

鉴于:

$ cat lines.txt
a/b
'c/d e/f'

$ cat 1.sh
#!/bin/sh
./2.sh `cat lines.txt`

$ cat 2.sh
#!/bin/sh
echo p1=$1
echo p2=$2
echo p3=$3

$ ./1.sh
p1=a/b
p2='c/d
p3=e/f'

如何更改lines.txtor 1.sh,以便2.sh仅接收两个参数:

  • a/b
  • c/d e/f

答案1

将 IFS(内部字段分隔符)设置为换行符:

$ cat 1.sh 
#!/bin/sh
OLD_IFS=$IFS
IFS="
"
./2.sh `cat lines.txt`
IFS=$OLD_IFS

$ ./1.sh
p1=a/b
p2='c/d e/f'
p3=

答案2

如果您没有陷入使用 cat 发送与文件长度一样多的参数的想法,您可能会发现此方法非常灵活。您可以将文件直接通过管道传输到 2.sh

# echo -e "a/b\n'c/d e/f'" >lines.txt

fn2.sh() { set -f              # disable pathname expansion 
   while IFS= read -r line; do # -r prevents expansion of such things as \n
       printf "%s\n" "$line"   # printf is more robust than echo (when dealing with unknown data)
   done 
}
< lines.txt fn2.sh             # using redirection 

答案3

如果您的输入文件包含该行'c/d e/f'并且您想要处理该项目c/d e/f(不带引号),那么您可能正在寻找xargs。它的输入格式是一个以空格分隔的字符串列表,其中包含字符'"定界文字字符串。另外,\使下一个字符按字面解释,但仅限于字符串之外。例如,这是一个输入文件:

how\'dy 'hello world' aaa\
bbb

该文件中的项目是how'dy,hello worldaaa␤bbb(其中是换行符)。

相关内容