我正在尝试从其他变量中读取其中包含一些文本的内容:
index:index.html:index2.html:index3.html
我希望变量“a”一次等于每个“index.html”,这样我就可以在变量a上运行另一个命令,但是当awk命令递增时,变量a只是空白。以下是我的代码
index="index:index.html:index2.html:index3.html"
counter=4
a=$(echo $index | awk -F: '{for(i=3;i<$counter;i++){printf $i}}')
答案 0 :(得分:0)
这应该这样做。将变量counter
传递给awk,使用print
代替printf
,将a
变量设为数组
index="index:index.html:index2.html:index3.html"
counter=4
a=( $(echo "$index" | awk -F: -v counter=$counter '{for(i=1;i<counter;i++){print $i}}') )
echo "${a[*]}"
结果
index index.html index2.html
答案 1 :(得分:0)
您的awk
程序存在一些错误,但如果您仅使用awk
拆分文件名,那么如果不使用{{1}则会更简单}。像这两个解决方案:
一次一个文件:
awk
使用数组:
OLD_IFS="$IFS"
IFS=:
index="index:index.html:index2.html:index3.html"
for a in $index
do
# here whatever you want to do with $a
echo "Value of a is '$a'"
done
IFS="$OLD_IFS"
两种解决方案都具有相同的输出:
OLD_IFS="$IFS"
IFS=:
index="index:index.html:index2.html:index3.html"
array=( $index )
for a in "${array[@]}"
do
# here whatever you want to do with $a
echo "Value of a is '$a'"
done
IFS="$OLD_IFS"
答案 2 :(得分:0)
通过询问如何使用特定工具(awk)实现此,您可能会问XY Problem。
我认为你可以完全避免使用awk,只需处理bash中的所有内容。
$ index="index:index.html:index2.html:index3.html"
$ IFS=:
$ declare a=( $index )
$ printf '%d\n' "${#a[@]}" # here's your field count...
4
$ declare -p a
declare -a a=([0]="index" [1]="index.html" [2]="index2.html" [3]="index3.html")
$ printf '> %s\n' "${a[@]}"
> index
> index.html
> index2.html
> index3.html
或者如果你想说在这个数组的每个元素上运行另一个命令,你可以在数组元素上使用for循环:
$ for file in "${a[@]}"; do printf '>> %s\n' "$file"; done
>> index
>> index.html
>> index2.html
>> index3.html