【发布时间】:2020-03-21 05:54:25
【问题描述】:
我将两个位置参数传递给要运行的脚本,两个参数都是路径,在分析路径的场景中,问题是有时会有一些路径,例如:m i sc . . . . .. . . 它有点和空格,有时甚至我们在目录名中有一个反斜杠。
尝试通过两个过程直接和通过at sign 获取参数。
SOURCE_ARG=$1
DESTINATION_ARG=$2
和
ARG_COUNT=0
for POSITIONAL_ARGUMENTS in "${@}"
do
((ARG_COUNT++))
ARGUMENT_ARRAY[$ARG_COUNT]=$POSITIONAL_ARGUMENTS
done
在循环中,我遍历转发给它们的命令的结果。
while IFS= read -r dir
do
echo "${ARGUMENT_ARRAY[1]}"
echo "${dir}"
while IFS= read -r item
do
# do some stuff
done < <(ls -A "$dir"/)
done < <(du -hP "$SOURCE_ARG" | awk '{$1=""; print $0}' | grep -v "^.$" | sed "s/^ //g")
当我使用echo "${ARGUMENT_ARRAY[1]}" 时,我得到的路径与我需要检查的路径相同,但是当在这里使用循环迭代变量作为 dir 时 ->echo "${dir}" 我得到了所有空格,因为该路径的其他命令无法执行他们的工作。
我要问的是如何在循环中获得$dir 的输出,就像我上面提到的echo "${ARGUMENT_ARRAY[1]}" 一样(所有空格和反斜杠的输入)
【问题讨论】:
-
对于初学者,您可以用
ARGUMENT_ARRAY=("$@")替换整个for循环,如果甚至需要该数组来代替"$@"本身。第二,don't parsels。除此之外,不清楚你在问什么。 -
不要使用全大写的变量名。这些通常保留给环境变量。
-
我在这里看不到任何会自动转义字符串的东西。
echo不这样做。当ls与--escape选项一起使用时,ls将转义名称,或者它正在写入终端,但它在此处写入管道。 -
如果文件名在一行中有多个空格,您使用
awk会将它们折叠成一个空格。 -
如果您对用法列不感兴趣,为什么要使用
du?如果您只需要目录列表,请使用find "$SOURCE_ARG" -type d
标签: linux bash shell command-line-arguments