我编写了以下小脚本来读取文件,在磁盘上提取搜索路径并使用mkdir创建它,现在由于某种原因,它创建的所有目录都有一个尾随?行军人物或可能是a / w
我做错了什么?
#! /bin/bash
echo "which file do you want to scan: "
read input
file=`echo $input | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]'`
#echo $file
while IFS= read -r line; do
a="$(cut -d'=' -f2 <<<"$line")"
if [[ "$a" =~ /opt.* ]]; then
echo $a
mkdir -p $a
fi
done < "$file"
脚本的结果如下所示:
/opt/dir/foo01/arch:
aggr_rec? aggr_rec_tag? input? input_tag?
并且?
标记不应该在那里
答案 0 :(得分:0)
您的输入文件很可能包含DOS行结尾\r\n
。例如:
$ mkdir -p /tmp/dos/file$'\r'
$ ls /tmp/dos
file?
在输入文件上使用dos2unix
。
但是你可以用一个sed
替换整个while循环:
#! /bin/bash
sed -n -e 's/^[^=]*=\(\/opt[^=]*\).*$/\1/p' <<EOF |
a=/tmp/1
b=/opt/2
c=/tmp/3
d=/opt/4
EOF
xargs -n1 echo mkdir
删除echo
以创建目录。
sed
选项-n
告诉sed
仅为s
成功替换产生输出。这会对/opt
前缀进行过滤。
xargs
选项-n
告诉xargs
只使用一个参数,但这是可选的,因为mkdir
可以一次创建多个目录。