2015-08-25 3 views
0
sh temp1.sh Gold.txt Silver.txt 
2 
Gold.txt 
$2 

Серебро занимает второе место в золоте. Это уникальное место в конкурсе.с использованием команды cat с переменной unix

cat: cannot open $2 

tstetlx() /appl/edw/apps/scripts/scenario1> vi temp1.sh 
i=$# 
echo $i 
echo $1 
echo $`echo $i` 
#cat "$`echo $i`" 
cat $2 
cat "\$$i" 

Следующая команда не печатает содержимое второго файла, переданного в качестве аргумента файла.

cat "\$$i" 

ответ

0

Непонятно мне, что вы пытаетесь сделать. Рассмотрите возможность использования $1 или $2.

Причина, по которой происходит сбой линии, заключается в том, что параметр для cat буквально равен 2 долларам - никакая попытка оболочки не заменять $ 2, как если бы она была переменной.

Это один из способов решения проблемы. Обратите внимание, что это решение bash.

i=$# 
echo $i 
echo $1 
echo $`echo $i` 
#cat "$`echo $i`" 
cat $2 
cat "\$$i" 
declare -a arr=("$0" [email protected]) 
echo ${arr[i]} 
cat ${arr[i]} 
0

Убедитесь, что файл Silver.txt существует в том же каталоге, что и temp1.sh.

Что касается переменной косвенностью вы пытаетесь сделать с cat "\$$i", вы хотите eval:

eval cat "\$$i" 

Однако eval может быть опасным. Убедитесь, что переменная, которую вы будете оценивать, действительна, особенно если ее содержимое происходит от пользовательского ввода. Запустите это и посмотрите, что я имею в виду:

eval cat "\$$i;ps -ef" 

Он будет запускать команду, если ее можно манипулировать, чтобы ее содержать. См. Этот пост для лучшего обсуждения причин и альтернатив: Why should eval be avoided in Bash, and what should I use instead?.