Bash 使用head和cut定义变量
可能是一个简单的问题,我是bash新手,还没有找到问题的解决方案 我正在写以下脚本:Bash 使用head和cut定义变量,bash,variables,Bash,Variables,可能是一个简单的问题,我是bash新手,还没有找到问题的解决方案 我正在写以下脚本: for file in `ls *.map`; do ID=${file%.map} convertf -p ${ID}_par #this is a program that I use, no problem NAME=head -n 1 ${ID}.ind | cut -f1 -d":" #Now: This step is the problem: don't seem to be able t
for file in `ls *.map`; do
ID=${file%.map}
convertf -p ${ID}_par #this is a program that I use, no problem
NAME=head -n 1 ${ID}.ind | cut -f1 -d":" #Now: This step is the problem: don't seem to be able to make a proper NAME function. I just want to take the first column of the first line of the file ${ID}.ind
它给了我回报
第5行:糟糕的替代
有什么帮助吗
谢谢 您的代码中有几个问题:
- `ls*.map`中文件的
中的文件使用不符合您的要求。它将失败,例如,如果任何文件名包含空格或
,但还有更多。有关详细信息,请参阅 您只需对*.map*
- 所有大写名称通常用于系统变量和内置shell变量。使用小写字母表示您自己的姓名
for file in *.map; do
id="${file%.map}"
convertf -p "${id}_par"
name="$(head -n 1 "${id}.ind" | cut -f1 -d":")"
...
看起来会有用的。我们只需使用
$(cmd)
以字符串形式捕获命令的输出。您的代码中有几个问题:
- `ls*.map`中文件的
中的文件使用不符合您的要求。它将失败,例如,如果任何文件名包含空格或
,但还有更多。有关详细信息,请参阅 您只需对*.map*
- 所有大写名称通常用于系统变量和内置shell变量。使用小写字母表示您自己的姓名
for file in *.map; do
id="${file%.map}"
convertf -p "${id}_par"
name="$(head -n 1 "${id}.ind" | cut -f1 -d":")"
...
看起来会有用的。我们只需使用
$(cmd)
以字符串形式捕获命令的输出。谢谢!事实上,这正是我所需要的。感谢您对小写名称和“ls*.map”的建议,我在一位同事的脚本中看到了它,并对其进行了回收,不知道它有多有用/无用。@PGen如果您可以在不引起冒犯的情况下这样做,请将您的同事指向BashPutfalls条目——循环使用ls
的输出是一个非常常见的坏主意,并应尽可能地予以消除。顺便说一句,还要注意,最好在循环中添加[-e“$file”]| | continue
作为第一行,以防没有匹配的文件(在BashPittles讨论中提到了这一点)。@gordondavison或启用同样有效的nullglob
@melpome,但是您必须小心地关闭它,否则它可能会在以后导致意外的后果(并且它只在bash
中工作,而不是在其他一些shell中工作)。添加测试行看起来有点笨拙,但在我看来它更健壮。如果文本模式不匹配,我想不出什么时候我会想要它。谢谢!事实上,这正是我所需要的。感谢您对小写名称和“ls*.map”的建议,我在一位同事的脚本中看到了它,并对其进行了回收,不知道它有多有用/无用。@PGen如果您可以在不引起冒犯的情况下这样做,请将您的同事指向BashPutfalls条目——循环使用ls
的输出是一个非常常见的坏主意,并应尽可能地予以消除。顺便说一句,还要注意,最好在循环中添加[-e“$file”]| | continue
作为第一行,以防没有匹配的文件(在BashPittles讨论中提到了这一点)。@gordondavison或启用同样有效的nullglob
@melpome,但是您必须小心地关闭它,否则它可能会在以后导致意外的后果(并且它只在bash
中工作,而不是在其他一些shell中工作)。添加测试行看起来有点笨重,但在我看来它更健壮。如果文本模式不匹配,我真的想不出什么时候需要它。