2017-05-08 57 views
3

我有一个变量,其存储的目录路径,(任选地拥有者,组),和权限,与管分离:击:的防止评估的可变

line='/opt/temp/dir/*|||a+r' 

如果我回声$line,我得到的目录子在我所期望的方式和需要:

~ /opt/temp/dir/*|||a+r 

所以,现在我需要做的解析此行,其目录部分分配给相应的变量,像这样:

DIR=$(echo $line | awk -F "|" '{print $1}') 

问题是,当我回显$DIR时,由于*,我得到了整个子目录列表。

~ # echo $DIR 
/opt/oracle/asa_test/a1 
/opt/oracle/asa_test/a2 
/opt/oracle/asa_test/a3 
/opt/oracle/asa_test/test123 

但我需要得到完全的子/opt/temp/dir/*:正如你所看到的$line$DIR变量中评估

echo $DIR 
~ # /opt/temp/dir/* 

。 如何避免这种情况,并在第一个管道包括*之前获得第一个子串到$DIR变量?

+3

引用您的变量。 – 123

+0

哦的确如此,谢谢! –

回答

2

双引号你的变量,以避免在bashPathname Expansionecho "$DIR"

man bash页面,

路径名扩展

字分开后,除非-f选项设置,庆典扫描每个单词的字符*,?[。如果出现这些字符中的一个,则将该字视为模式,并且将 替换为与该模式匹配的按字母顺序排列的文件名列表。

+0

这是正确的,但是明确说明何时需要引用以及使用哪些引用会很有用。例如'echo“$ DIR”' –

+0

@WilliamPursell:谢谢!更新! – Inian

1

你不需要awk对于这个简单的任务:

line='/opt/temp/dir/*|||a+r' 
echo "${line%%|*}" 

如果你想字符串的字符|拆分,使用:

IFS='|' read -r -a fields < <(printf '%s|\0' "$line") 

这将使用字符串的字段填充数组fields: 命令declare -p fields将输出:

declare -a fields='([0]="/opt/temp/dir/*" [1]="" [2]="" [3]="a+r")'