Подстановка переменных Bash AWK - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь прочитать из другой переменной, в которой будет текст:

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}}')

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

В вашей программе awk есть некоторые ошибки, но если вы используете awk просто для разделения имен файлов, то будет гораздо проще, если вы не используете 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"

Оба решения имеют одинаковый вывод:

Value of a is 'index'
Value of a is 'index.html'
Value of a is 'index2.html'
Value of a is 'index3.html'
0 голосов
/ 04 мая 2018

Задавая вопрос, как достичь этого с помощью определенного инструмента (awk), вы можете задавать вопрос XY .

Я бы сказал, что вы можете вообще избежать 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
0 голосов
/ 04 мая 2018

Это должно сделать это. Передайте переменную 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...