read
我正在编写一个 bash 脚本,通过这两个字符串读取变量:
log.*.console.log log.*.log
它们被空间隔开。
如何重写脚本中调用的下一个程序的变量输出将采用这种形式的字符串?'log.*.console.log' 'log.*.log'
我正在尝试 sed 和 awk 但不知何故没有成功。
整个脚本:
#!/bin/bash
if [ -z "$*" ] ; then
echo "USAGE: ./some text"
exit 1
else
echo "some text"
read varlogname
i=1
for file in $@
do
echo "Doing" $file
GTAR=$(gtar -xvf $file --wildcards --ignore-case --no-anchored "$varlogname")
for file in ${GTAR[*]}
do
mv $file $file"."${i}
i=$((i+1))
done
done
echo "Files extracted."
fi
exit 0
答案1
我认为您不想给 加上单引号gtar
。在诸如 之类的命令中somecmd 'foo bar' 'files*.log'
,shell 将处理引号,它们告诉它不要特殊对待特殊字符,并传递somecmd
参数foo bar
和files*.log
。 Unix 程序不会将命令行作为一个字符串获取,而是将多个参数字符串获取,是 shell 将命令行分割为字符串。
如果你想read
在 Bash 中使用多个值,你可以使用read -a array
,然后将数组传递给命令。
-a array assign the words read to sequential indices of the array
variable ARRAY, starting at zero
IE
read -a filenames
gtar "${filenames[@]}"
使用(在引号中)索引数组[@]
会扩展为数组成员作为单独的单词,这就是您想要的。
另外,你有for file in ${GTAR[*]}
.这看起来像是GTAR
作为一个数组进行访问,但它不是一个数组,您只是将命令的输出gtar
作为字符串分配给它。在这种情况下${GTAR[*]}
与 相同$GTAR
。由于扩展没有被引用,字符串此时会进行分词,默认情况下会在空格上进行分割。但是,在那之后的话是还被视为文件名全局并扩展为匹配的文件名。
只要您的文件名不包含空格或 glob 字符 ( *?[]
,就可以了。但一般来说,这不是您想要做的事情。
对于正确的数组,您可能总是想使用"${array[@]}"
而不是[*]
.