我已经在 MVS 上编程多年,最近一直在使用 Linux,所以我的 Linux 技能还不是很好,但我很好地理解开发概念。
我想做的是读取文件目录并获取扩展名为 .trg 的所有文件的名称。然后,我需要获取这些名称并将它们存储在单独的变量中,以便稍后在脚本中使用它们来引用组件并将它们用于文件命名。我已经使用 find 命令获取了文件名:
param=`find *${file_name}*.trg
这生成了加载了值 (ABC1099R ABC1099C) 的 $param 变量,因为它们是名为 ABC1099R.trg 和 ABC1099C.trg 的目录中的两个文件,我现在需要将这些值分配给各个变量,以便稍后在脚本中使用它们。我在网上搜索过很多次,但我找到的每个例子都是使用 echo 来显示它们,或者它们使用 do while 循环并使用循环中的各个值。我需要将它们分配给自己的变量,以便我稍后在脚本中可以使用它们。
最初我尝试了这样的 for do 循环:
for trigger_files in $param; do
app1=(basename "{trigger_files}" .trg).dat
done
但这只给出了第一次出现 app1=ABC1099R
我需要将所有出现的情况保存到它们自己的单独变量中。可能有 20 个文件名,但我想我只需要让它与两个文件名一起工作,因此它能够处理很多文件名。
答案1
如果您正在使用巴什,请考虑以 bash 方式进行。
您的数组将由此获得(无外部find
命令):
params=( *${file_name}*.trg )
然后像这样循环遍历数组:
for file in "${params[@]}"; do
echo "I'm happily reading the beautiful file $file"
done
如果您想删除.trg
扩展并将其替换为.banana
:
for file in "${params[@]}"; do
echo "My gorilla loves the file ${file%.trg}.banana"
done
这种方法,加上正确的引用,对于名称中带有有趣符号的文件来说将是 100% 安全的。
评论。始终将通配符与shopt -s nullglob
或一起使用shopt -s failglob
。
答案2
您可以将 param 声明为数组而不是字符串:
declare -a param=(`find *${file_name}*.trg`)
现在,您可以使用索引访问各个值,就像它们位于各个变量一样。例如:
echo ${param[1]}
将打印ABC1099C.trg
(数组中的第二个元素。索引从 0 开始)。
如果你想去掉文件扩展名,你可以尝试${param[1]%.*}
要了解有关数组的更多信息,请查看此处: