在 shell 脚本中使用粘贴命令
Using paste command inside shell script
我有 3 个文本文件。我想阅读它们并将它们存储在不同的变量中,然后使用粘贴将它们连接起来并在控制台中打印它们。
我尝试了以下代码,但它抛出了一个错误
File not found
这是我的代码
#!/bin/sh
value_1=`cat file_1.txt`
value_2=`cat file_2.txt`
value_3 = paste $value_1 $value_2
echo "$value_3"
#!/bin/sh
value_1=$(cat file_1.txt
value_2=$(cat file_2.txt)
value_3=$(echo $value_1 $value_2 | paste) # or value_3="$value1 $value2"
echo "$value_3"
注:
- 在 shell
中 =
附近不允许 space
- 反引号
`
用于旧式命令
替换,例如
foo=`command`
建议使用 foo=$(command)
语法。 $()
中的反斜杠处理并不令人惊讶,并且 $()
更容易嵌套。
第三行应该是
value_3=`paste file_1.txt file_2.txt`
您需要反引号,value_3
后没有 space,并且不使用变量作为参数,使用文件名。
它说 "file not found" 的原因是因为 value_3
在被解释为 运行 之后带有 space 的命令。
paste
期望它的参数是文件名,而不是文件内容。使用 bash、ksh 或 zsh,可以解决这个问题。替换:
paste $value_1 $value_2
与:
paste <(echo "$value_1") <(echo "$value_2")
<(...)
称为进程替换。它使括号内命令的输出看起来像一个文件。
改进
如果我们不知道输出中的第一个字符,那么 printf
比 echo
:
更可靠
paste <(printf "%s" "$value_1") <(printf "%s" "$value_2")
例子
让我们使用这两个测试文件:
$ cat file1
1
2
$ cat file2
a
b
现在,让我们将这些文件读入变量并将粘贴应用于这些变量:
$ value_1=$(cat file1); value_2=$(cat file2)
$ paste <(printf "%s" "$value_1") <(printf "%s" "$value_2")
1 a
2 b
或者,将输出保存在变量中:
$ value_3=$(paste <(printf "%s" "$value_1") <(printf "%s" "$value_2"))
$ echo "$value_3"
1 a
2 b
我有 3 个文本文件。我想阅读它们并将它们存储在不同的变量中,然后使用粘贴将它们连接起来并在控制台中打印它们。 我尝试了以下代码,但它抛出了一个错误
File not found
这是我的代码
#!/bin/sh
value_1=`cat file_1.txt`
value_2=`cat file_2.txt`
value_3 = paste $value_1 $value_2
echo "$value_3"
#!/bin/sh
value_1=$(cat file_1.txt
value_2=$(cat file_2.txt)
value_3=$(echo $value_1 $value_2 | paste) # or value_3="$value1 $value2"
echo "$value_3"
注:
- 在 shell 中
- 反引号
`
用于旧式命令
=
附近不允许 space
替换,例如
foo=`command`
建议使用 foo=$(command)
语法。 $()
中的反斜杠处理并不令人惊讶,并且 $()
更容易嵌套。
第三行应该是
value_3=`paste file_1.txt file_2.txt`
您需要反引号,value_3
后没有 space,并且不使用变量作为参数,使用文件名。
它说 "file not found" 的原因是因为 value_3
在被解释为 运行 之后带有 space 的命令。
paste
期望它的参数是文件名,而不是文件内容。使用 bash、ksh 或 zsh,可以解决这个问题。替换:
paste $value_1 $value_2
与:
paste <(echo "$value_1") <(echo "$value_2")
<(...)
称为进程替换。它使括号内命令的输出看起来像一个文件。
改进
如果我们不知道输出中的第一个字符,那么 printf
比 echo
:
paste <(printf "%s" "$value_1") <(printf "%s" "$value_2")
例子
让我们使用这两个测试文件:
$ cat file1
1
2
$ cat file2
a
b
现在,让我们将这些文件读入变量并将粘贴应用于这些变量:
$ value_1=$(cat file1); value_2=$(cat file2)
$ paste <(printf "%s" "$value_1") <(printf "%s" "$value_2")
1 a
2 b
或者,将输出保存在变量中:
$ value_3=$(paste <(printf "%s" "$value_1") <(printf "%s" "$value_2"))
$ echo "$value_3"
1 a
2 b