Передача аргументов из командной строки в сценарий tcl

#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]}] .

3. ссылка fundza.com/tcl/script_shell/arguments/index.html

Ответ №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