#bash #tcl
#bash #tcl
Вопрос:
У меня есть сценарий TCL, который имеет множество параметров, определенных в качестве аргументов. Я намерен создать файл задания, в котором я смогу выполнить сценарий .tcl с различными комбинациями параметров без ручного вмешательства.
Я имею в виду следующее:
Файл задания (run.sh ):
./main.tcl arg1 arg2 arg3 arg4
./main.tcl arg1 arg3 arg5
Теперь я хочу иметь возможность передавать массив аргументов командной строки «argv» для каждого запуска, упомянутого в run.sh в виде массива в скрипт main.tcl, чтобы параметры были установлены соответствующим образом в скрипте перед выполнением.
Есть ли способ связать скрипт .sh и скрипт .tcl?
Комментарии:
1. Внутри вашего сценария оболочки вы можете ссылаться на список всех аргументов как $@ . Так что просто скажите
main.tcl $@
2. @JohnC — спасибо за ответ! хорошо, поэтому, если я сделаю ./main.tcl $ @ внутри моего run.sh , тогда как я могу получить аргументы внутри main.tcl? используя argv?
3. Я думаю, что приведенный ниже ответ объясняет это для вас.
Ответ №1:
Согласно онлайн-документу здесь:
Метод, с помощью которого числа могут передаваться в скрипт и использоваться им, заключается в следующем.
argc argv argv0
Все сценарии Tcl имеют доступ к трем предопределенным переменным. $argc — количество элементов аргументов, передаваемых скрипту. $argv — список аргументов. $argv0 — имя скрипта.
Чтобы использовать аргументы, сценарий можно переписать следующим образом.
if { $argc != 2 } { puts "The add.tcl script requires two numbers to be inputed." puts "For example, tclsh add.tcl 2 5". puts "Please try again." } else { puts [expr [lindex $argv 0] [lindex $argv 1]] }
Комментарии:
1. Теперь эта связь мертва.
2. Обратите внимание, что написанное таким образом, это равносильно уязвимости при внедрении команды, попробуйте,
tclsh that-script '[exec sh -c {id>/dev/tty; echo 1}]' 2
например, с помощью. Лучше сputs [expr {[lindex $argv 0] [lindex $argv 1]}]
.
Ответ №2:
В дополнение к приведенному выше ответу я нашел следующее полезным:
Для запуска в QuestaSim / ModelSim / Quartus я следил за следующим ресурсом: http://www.alteraforum.com/forum/showthread.php?t=3034
Обычно мы можем запускать .tcl-скрипты с source
помощью команды, но это по своей сути не обрабатывает аргументы, которые обычно могут использовать сценарии base .tcl. Таким образом, используя процесс, вы можете добиться того же.
Ответ №3:
Для демонстрации того, как передавать аргументы из командной строки в сценарий TCL:
Создайте текстовый файл с именем args.tcl
, который содержит следующие команды:
# If no command line arguments are passed perform no actions
if {$argc > 0} {
# argv0 conatins the filename of the script
puts "The name of the script is: $argv0"
# argc contains the count of the arguments passed
puts "Total count of arguments passed is: $argc"
# argv contains a list of the arguments
puts "The arguments passed are: $argv"
# Using the List Index of argv print a specific argument
puts "The first argument passed was [lindex $argv 0]"
}
После создания файла вызовите сценарий с помощью следующей командной строки:
> Tclsh85 args.Tcl ONE 2 3
The name of the script is: args.Tcl
Total count of arguments passed is: 3
The arguments passed are: ONE 2 3
The first argument passed was ONE
>
Ссылка: Кулинарная книга по программированию Tcl / Tk 8.5