相关疑难解决方法(0)

从bash中的$ @中删除第一个元素

我正在编写一个bash脚本,需要循环传递给脚本的参数.但是,第一个参数不应该循环,而是需要在循环之前进行检查.

如果我不必删除第一个元素,我可以这样做:

for item in "$@" ; do
  #process item
done
Run Code Online (Sandbox Code Playgroud)

我可以修改循环以检查它是否在第一次迭代中并改变行为,但这似乎太过于苛刻.必须有一个简单的方法来提取第一个参数然后循环其余的,但我无法找到它.

arrays bash

119
推荐指数
4
解决办法
7万
查看次数

在Bash完成的上下文中关于$ {array [*]}与$ {array [@]}的混淆

我正在尝试第一次编写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[@]}扩展到了什么.

arrays bash bash-completion

73
推荐指数
2
解决办法
3万
查看次数

将第二个参数从shell脚本传递到Java

如果我将任意数量的参数传递给在内部调用Java程序的shell脚本,那么除了第一个参数之外,如何将第二个参数传递给Java程序?

./my_script.sh abcd ....

#my_script.sh
...
java MyApp b c d ...
Run Code Online (Sandbox Code Playgroud)

bash

45
推荐指数
2
解决办法
3万
查看次数

阻止Python在shebang中生成pyc文件

有没有办法阻止python创建.pyc文件,已经在Python脚本的shebang(或魔法数字)中?

不工作:

#!/usr/bin/env python -B
Run Code Online (Sandbox Code Playgroud)

python shell scripting pyc

7
推荐指数
2
解决办法
991
查看次数

如何从以前的bash命令获得倒数第二个参数?(在交互式bash shell中)

如何在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

5
推荐指数
2
解决办法
1465
查看次数

git diff --name-only 迭代结果时如何处理文件名中的空格

我正在处理的脚本需要从 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)

git bash spaces git-diff git-bash

5
推荐指数
3
解决办法
3442
查看次数

Mac 终端中的 cut 命令缺少补足选项

根据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

unix macos text-processing cut sh

3
推荐指数
1
解决办法
7281
查看次数

如何移植性使用“${@:2}”?

允许变量赋值中的 ${@: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)

arrays bash shell posix shellcheck

3
推荐指数
1
解决办法
445
查看次数

${@:3} 在 bash 中意味着什么?

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)

bash

2
推荐指数
1
解决办法
947
查看次数