作为Unix新手,我希望解析文件的完整路径
/Users/E/atsp_0001.tar.gz
进入0001
并将0001
分配给变量sub_id
。
解析虽然可能很笨拙,但却是这样的:
E$ file=/Users/E/atsp_0001.tar.gz
E$ echo ${file##*/} | cut -d "_" -f2 | cut -d "." -f1
0001
然后,我没有将0001
分配给这样的变量:
E$ file=/Users/E/atsp_0001.tar.gz
E$ sub_id=${file##*/} | cut -d "_" -f2 | cut -d "." -f1
E$ echo ${sub_id}
E$
如果有人能的话,我会非常感激 (1)解释为什么这不起作用以及如何解决它,以及(2)改进笨拙的解析。
答案 0 :(得分:1)
这就是我们这样做的方式。您可以使用$()
。您也可以使用``而不是$()
,但我不推荐它。
:~> file=/Users/E/atsp_0001.tar.gz
:~> echo ${file##*/} | cut -d "_" -f2 | cut -d "." -f1
0001
:~> variabletest=$(echo ${file##*/} | cut -d "_" -f2 | cut -d "." -f1)
:~> echo $variabletest
0001
您在变量赋值中执行多个操作,而不是存储值,这就是它不适合您的原因
echo
将打印数据,但您正在进行管道操作,因此在您将其括起来将其标记为单个操作之前不会工作。您的解析是正常的,因为它取决于您的文件命名约定。但我会使用基本名称命令
:~> echo $file
/Users/E/atsp_0001.tar.gz
:~> basename $file
atsp_0001.tar.gz
这将剥离出路径。
所以你可以做variabletest=$(echo basename $file | cut -d "_" -f2 | cut -d "." -f1)