切割后为变量赋值?

时间:2014-09-02 09:49:14

标签: linux

作为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)改进笨拙的解析。

1 个答案:

答案 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)