0

假设您要制作一个bash不支持任何选项但行为类似于 的脚本cp,因为cp您的系统提供的不接受多个来源。

系统(假设和损坏)的用法cp是:

cp source target    # target may be a directory

该脚本的用法将是:

cp.sh source... target    # target must be a directory

这是脚本的起点:

#!/bin/bash
tgt="$1"
shift
for src in "$@"; do
    echo cp $src $tgt
done

当使用参数“ a b c d”(注意这d是目标)运行时,它输出:

cp b a
cp c a
cp d a

目标是修复脚本以输出它,同时保持代码简单:

cp a d
cp b d
cp c d
4

8 回答 8

5

/test.bash 源 1 源 2 目标 1

#!/bin/bash

target=${!#} 

if [ ! -d $target ] ; then
    echo "$target must be a directory " >&2
    exit 1;
fi

args=("$@")
unset args[${#args[@]}-1]

for src in "${args[@]}"; do
    echo cp $src $target
done

将输出

cp source1 target1
cp source2 target1
于 2009-09-22T18:59:25.433 回答
2

您可以使用数组切片来省略最后一个参数:

tgt="${!#}"
for src in "${@:1:$#-1}"; do
    cp "$src" "$tgt"
done
于 2009-09-23T15:31:13.827 回答
1

为什么?cp 命令已经这样做了。做个man cp,你会看到的。

如果您仍然坚持,这里有两种方法可以得到最后一个参数。方法1:将命令行放入数组中,提取最后一个元素:

arg=("$@")
last_arg=${arg[(($# - 1))]}

第一行将命令行参数放入数组 arg 中。如果你的命令行包含abcd那么 arg[0] == 'a', ... argv[3] == 'd'。

第二行提取最后一个参数。(($# - 1)) 接受参数的数量(在这种情况下为 4),从中减去 1(得到 3)。然后该表达式变为:

last_arg=${arg[3]}

指向最后一个论点。


第二种方法不是很便携,它使用 BASH_ARGV 变量,它是 $@,但顺序相反。如果你的命令行是abcd那么 ${BASH_ARGV[0]} == 'd', ... ${BASH_ARGV[3]} == 'a':

last_arg=${BASH_ARGV[0]}

我希望这有帮助。

于 2009-09-22T17:55:17.397 回答
1
#!/bin/bash
tgt="${@: -1}"    # get the last parameter
for src in "$@"; do
    if [[ $src != $tgt ]]; then
        echo cp "$src" "$tgt"
    fi
done
于 2009-09-22T18:16:36.940 回答
0
#!/bin/bash
t=(x "$@")
i=1; while [ $i -lt $# ]; do
  echo cp ${t[$i]} ${t[$#]}
  i=$(($i + 1))
done
于 2009-09-22T18:12:56.930 回答
0

您不需要任何特定于 bash 的功能:

评估最后=\${$#}
而 [ $# -gt 1 ]; 做
  回声“cp $1 $last”
  转移
完毕
于 2009-09-25T16:26:09.610 回答
0

您可以直接执行此操作,而无需使用xargs编写脚本:

echo source1 source2 | tr "\n" "\0" | tr " " "\0" | 
   xargs --verbose -0 -I{} cp {} dest
于 2009-09-25T19:58:47.887 回答
-1

使用它来提取最后一个参数:

评估 tgt=\$$#

然后以与您相同的方式处理,当您点击 $# 时退出循环

这是 whjole 脚本:

eval tgt=\$$#

for src in $@
do
 if [ "$src" == "$tgt" ];
 then
    exit
fi
echo cp $src $tgt
done

如果你问我,很简单!

于 2009-09-22T17:56:55.490 回答