我正在编写一个bash脚本,需要循环传递给脚本的参数.但是,第一个参数不应该循环,而是需要在循环之前进行检查.
如果我不必删除第一个元素,我可以这样做:
for item in "$@" ; do
#process item
done
Run Code Online (Sandbox Code Playgroud)
我可以修改循环以检查它是否在第一次迭代中并改变行为,但这似乎太过于苛刻.必须有一个简单的方法来提取第一个参数然后循环其余的,但我无法找到它.
我正在尝试第一次编写Bash完成,我对解除引用Bash数组(${array[@]}和${array[*]})的两种方法感到困惑.
这是相关的代码块(顺便说一句,它可以工作,但我想更好地理解它):
_switch()
{
local cur perls
local ROOT=${PERLBREW_ROOT:-$HOME/perl5/perlbrew}
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
perls=($ROOT/perls/perl-*)
# remove all but the final part of the name
perls=(${perls[*]##*/})
COMPREPLY=( $( compgen -W "${perls[*]} /usr/bin/perl" -- ${cur} ) )
}
Run Code Online (Sandbox Code Playgroud)
Bash的文档说:
可以使用$ {name [subscript]}引用数组的任何元素.需要大括号以避免与shell的文件名扩展运算符冲突.如果下标是'@'或'*',则该单词将扩展为数组名称的所有成员.这些下标仅在单词出现在双引号内时有所不同.如果单词是双引号,则$ {name [*]}扩展为单个单词,每个数组成员的值由IFS变量的第一个字符分隔,$ {name [@]}扩展名称的每个元素一个单独的词.
现在我想我明白,compgen -W期望一个字符串包含可能的替代词列表,但在这种情况下,我不明白"$ {name [@]}将名称的每个元素扩展为单独的词"是指.
长话短说:${array[*]}作品; ${array[@]}没有.我想知道为什么,我想更好地理解究竟是什么${array[@]}扩展到了什么.
如果我将任意数量的参数传递给在内部调用Java程序的shell脚本,那么除了第一个参数之外,如何将第二个参数传递给Java程序?
./my_script.sh abcd ....
#my_script.sh
...
java MyApp b c d ...
Run Code Online (Sandbox Code Playgroud) 有没有办法阻止python创建.pyc文件,已经在Python脚本的shebang(或魔法数字)中?
不工作:
#!/usr/bin/env python -B
Run Code Online (Sandbox Code Playgroud) 如何在bash交互式shell中轻松获取前一个命令的倒数第二个(倒数第二个)单词/参数?我经常在后台运行命令,我想获取之前指定的文件&,例如,
% echo foo > /tmp/foo &
% cat !$
% &
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,!$给出最后一个单词,&.但我想要倒数第二个论点,/tmp/foo
请注意,可以使用类似范围的单词指示符!-1:3,但这对于具有大量单词的命令来说是不切实际的,其中不太明显有多少单词,例如,
% (set -x; date; pwd; git status; git diff; git log | tail -30; date; args=--verbose time make test; date) >& /tmp/log/make.test.20150122-Thu-0834 &
% echo !-1:30
/tmp/log/make.test.20150122-Thu-0834
Run Code Online (Sandbox Code Playgroud)
上面的示例有效,但您必须计算并知道您想要的单词是第30个单词,这非常耗时且容易出错.
有一个简单的方法来获得倒数第二个(倒数第二个)单词吗?
(请注意,此问题是指交互式shell中前一个命令的参数,而不是指从命令行传递给shell脚本的参数,因为这里的一些答案和注释是指.)
bash shell command-line command-line-arguments interactive-shell
我正在处理的脚本需要从 git diff 中遍历每个文件。但是,我不知道如何处理文件名中的空格。任何有空格的文件都被分成“2 个文件”。我知道它们需要被包裹," "但我不知道如何在它进入@参数之前实现它。
当文件名中有空格时,我应该如何遍历文件
git diff --name-only $1
Run Code Online (Sandbox Code Playgroud)
?
这是一个重现错误的简单测试:
copyfiles()
{
echo "Copying added files"
for file in $@; do
new_file=$(echo ${file##*/})
directory=$(echo ${file%/*})
echo "Full Path is is $file"
echo "File is $new_file"
echo "Directory is $directory"
cp $file $COPY_TO
done
}
COPY_TO="testDir"
DIFF_FILES=$( git diff --name-only $1)
copyfiles $DIFF_FILES
Run Code Online (Sandbox Code Playgroud)
该脚本目前运行如下:
test.sh <git commit id>
Run Code Online (Sandbox Code Playgroud) 根据此cut 命令缺少 --complement 选项。关于如何获得这个有什么建议吗?
我需要这个,因为 Linux sh 支持它
我的问题与此非常相似,所以我尝试按照以下方法使其工作
#!/bin/sh
EXTRA=$@
REST=`echo $EXTRA | cut -d ' ' --complement -s -f1`
echo $REST
Run Code Online (Sandbox Code Playgroud)
有任何建议欢迎提出
PS:我不能使用 bash 代替 sh
在允许变量赋值中的 ${@:2} 语法上,他们说我不应该使用,"${@:2}"因为它破坏了不同 shell 的内容,而我应该使用它"${*:2}"。
但是,使用"${*:2}"的,而不是"${@:2}"完全是无稽之谈,因为这样做"${@:2}"不等同于"${*:2}"如下面的例子:
#!/bin/bash
check_args() {
echo "\$#=$#"
local counter=0
for var in "$@"
do
counter=$((counter+1));
printf "$counter. '$var', ";
done
printf "\\n\\n"
}
# setting arguments
set -- "space1 notspace" "space2 notspace" "lastargument"; counter=1
echo $counter': ---------------- "$*"'; counter=$((counter+1))
check_args "$*"
echo $counter': ---------------- "${*:2}"'; counter=$((counter+1))
check_args "${*:2}"
echo $counter': ---------------- "${@:2}"'; counter=$((counter+1))
check_args "${@:2}"
Run Code Online (Sandbox Code Playgroud)
-->
GNU bash, version 4.4.12(1)-release …Run Code Online (Sandbox Code Playgroud) 在dist_train.shmmdetection3d中,最后一行做了什么?${@:3}
我无法理解它的 bash 语法。
#!/usr/bin/env bash
CONFIG=$1
GPUS=$2
NNODES=${NNODES:-1}
NODE_RANK=${NODE_RANK:-0}
PORT=${PORT:-29500}
MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"}
PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \
python -m torch.distributed.launch \
--nnodes=$NNODES \
--node_rank=$NODE_RANK \
--master_addr=$MASTER_ADDR \
--nproc_per_node=$GPUS \
--master_port=$PORT \
$(dirname "$0")/train.py \
$CONFIG \
--seed 0 \
--launcher pytorch ${@:3}
Run Code Online (Sandbox Code Playgroud)