以下是从命令行向bash脚本中提取输入的代码:
input=(*);
for i in {1..5..1}
do
input[i]=$($i);
done;
我的问题是:如何从输入命令行获取$ 1,$ 2,$ 3,$ 4的值,其中命令行代码输入为:
bash script.sh "abc.txt" "|" "20" "yyyy-MM-dd"
注意:不使用 for i in" $ {@}"
答案 0 :(得分:2)
#!/bin/bash
for ((i=$#-1;i>=0;i--)); do
echo "${BASH_ARGV[$i]}"
done
示例:./script.sh a "foo bar" c
输出:
a foo bar c
答案 1 :(得分:0)
如果我正确理解你要做的事情,你可以写:
'ask'
将位置参数复制到名为
var stompit = require('stompit')
var reconnectOptions = {
'maxReconnects': 100,
'randomize' : false
};
var connManager = new stompit.ConnectFailover("failover:(stomp://mqbroker.nyc:61613,stomp://failovermqbroker.nyc:61613)", reconnectOptions);
connManager.on('error', function(error) {
var connectArgs = error.connectArgs;
var address = connectArgs.host + ':' + connectArgs.port;
console.error('Could not connect to ' + address + ' : ' + error.message);
});
connManager.on('connecting', function(connector) {
var address = connector.serverProperties.remoteAddress.transportPath;
console.log('Connecting to ' + address);
});
var totalMsgs = 50;
var count = 0;
var delayMs = 10000;
connManager.connect(function(error, client, reconnect) {
if (error) {
console.log("terminal error, given up reconnecting: " + error);
return;
}
client.on('error', function(error) {
// destroy the current client
client.destroy(error);
// calling reconnect is optional and you may not want to reconnect if the
// same error will be repeated.
reconnect();
});
var sendParams = {
'destination' : '/queue/myqueue',
'persistent' : 'true'
}
function sendMsg (){
setTimeout( function () {
console.log ('sending message ' + (count));
client.send(sendParams).end('Hello number ' + (count));
if (count++ < totalMsgs) {
sendMsg(count);
}
else {
client.send(sendParams).end('DISCONNECT');
client.disconnect();
console.log("Done.");
}
}, delayMs);
}
sendMsg();
});
的数组中。
如果您只想要前五个位置参数,可以写:
input=("$@")
编辑添加:或者您是否在询问,如果变量input
包含整数input=("${@:1:5}")
,您如何获得i
?如果这是您的问题,那么 - 您可以使用间接扩展,其中Bash检索变量的值,然后使用该值作为要替换的变量的名称。间接扩展使用2
字符:
$2
但这几乎总是一个坏主意。你应该重新考虑你正在做的事情。
答案 2 :(得分:0)
我不知道您对for i in "$@"; do...
的反对意见,但您当然可以使用shift
执行此操作,例如:
while [ -n "$1" ]; do
printf " '%s'\n" "$1"
shift
done
<强>输出强>
$ bash script.sh "abc.txt" "|" "20" "yyyy-MM-dd"
'abc.txt'
'|'
'20'
'yyyy-MM-dd'
就个人而言,我不明白为什么要排除for i in "$@"; do ...
这是一种有效的方法来迭代通过保留引用空格的args。您还可以使用数组和C风格的循环,如其他答案中所示。
注意:如果您要使用input
数组,则应使用input=("$@")
代替input=($*)
。使用后者不会在您的位置参数中保留引用的空格。 e.g。
input=("$@")
for ((i = 0; i < ${#input[@]}; i++)); do
printf " '%s'\n" "${input[i]}"
done
工作正常,但如果你使用input=($*)
参数行"a b"
,它会将它们视为两个单独的参数。