перезагрузить переменную строку внутри другой строки - PullRequest
0 голосов
/ 06 мая 2020

Я должен объявить строку, состоящую из разных переменных, в начале al oop, чтобы распечатать ее позже, просто с помощью eval $command >> file.txt, избегая повторного ввода каждый раз самой строки $command. Но моя строка $command состоит из других переменных, и мне нужно обновить их перед печатью. Вот краткий пример:

a=0
command="echo \"$a\""
for i in {1..2}; do
    ### change variable $a
    a="$i"
    ### print command with the new $a
    eval "$command"
done

### (it fails) result:
0
0

Мне нужно, чтобы $a перезагружался каждый раз, чтобы его можно было заменить в строке $command, поэтому l oop выше вернет

### wanted result
1
2

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

Заранее большое спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

Вы можете использовать function вместо присвоения переменной

#!/usr/bin/env bash

a=0 
command(){ echo "$1" ; }

for i in {1..2}; do
  a="$i" 
  command "$a"
done

Изменить: согласно @glenn jackman можно использовать глобальную переменную

command(){ echo "$a"; }

И просто вызовите функцию без аргумента $a

command
1 голос
/ 06 мая 2020

Когда вы помещаете переменную внутрь ", она расширяется. Используйте одинарные кавычки для присвоения командной переменной.

$a=0
$command="echo \"$a\""
$echo $command 
echo "0"
$command='echo \"$a\"'
$echo $command 
echo \"$a\"
$

Попробуйте

a=0
command='echo $a'
for i in {1..2}; do
    ### change variable $a
    a="$i"
    ### print command with the new $a
    eval "$command"
done
...