Wiz*_*d79 9 shell bash quoting
我试图在 bash 变量中存储多行,但它似乎不起作用。
例如,如果我/bin每行列出一个文件并将其存储在 中$LS,那么我将$LS作为标准输入传递给wc,它总是返回 1:
$ ls -1 /bin | wc -l
134
$ LS=$(ls -1 /bin); wc -l <<< $LS
1
Run Code Online (Sandbox Code Playgroud)
如果我尝试输出到屏幕,我会得到各种结果:echo在一行上打印所有行,而printf只打印第一行:
#!/bin/bash
LS=$(ls -1 /bin)
echo $LS
printf $LS
Run Code Online (Sandbox Code Playgroud)
那么,一个 bash 变量可以包含多行吗?
cuo*_*glm 16
您需要双引号它(并且在大多数情况下您应该 双引号变量):
echo "$LS"
Run Code Online (Sandbox Code Playgroud)
但是不要使用 echo来打印变量内容,而是使用printf:
printf '%s\n' "$LS"
Run Code Online (Sandbox Code Playgroud)
换行符在变量中。LS=$(ls -1)将变量设置LS为的输出ls -1(ls顺便说一下,它产生与 相同的输出,除非输出到终端),减去尾随换行符。
问题是您在打印出值时删除了换行符。在 shell 脚本中,$LS并不是指“变量的值LS”,而是指“取 的值LS,根据 将其拆分为单词IFS并将每个单词解释为 glob 模式”。要获得 的值LS,您需要编写"$LS",或者更一般地说是放在$LS双引号之间。
echo "$LS"打印 的值LS,除了在解释反斜杠字符的某些 shell 中,以及一些以-.
printf "$LS"打印的值LS,只要它不包含任何百分比或反斜线字符和(与大多数实现方式中)不与启动-。
要LS准确打印 的值,请使用printf %s "$LS"。如果你想在最后换行,请使用printf '%s\n' "$LS".
请注意,$(ls)通常不是当前目录中的文件列表。这仅在您有足够温和的文件名时才有效。要获取文件名列表(点文件除外),您需要使用通配符:*. 结果是一个字符串列表,而不是一个字符串,所以你不能把它赋给一个字符串变量;您可以files=(*)在支持它们的 shell(ksh93、bash、zsh)中使用数组变量。
有关更多信息,请参阅为什么我的 shell 脚本会因空格或其他特殊字符而阻塞?
| 归档时间: |
|
| 查看次数: |
20422 次 |
| 最近记录: |