如何使用for循环从命令行获取值

时间:2016-02-29 06:39:32

标签: linux bash shell

以下是从命令行向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" $ {@}"

3 个答案:

答案 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",它会将它们视为两个单独的参数。

相关问题