Bash 脚本:如何使用两位数(如“p10=$10”)或指定全部(用于 File-Roller 脚本)

Bash 脚本:如何使用两位数(如“p10=$10”)或指定全部(用于 File-Roller 脚本)

我是新来的,加入是为了问一个关于脚本的问题(第一个答案是如何在 Nautilus 中禁用“提取已成功完成”对话框?) 并且无法在其下方“发表评论”(没有声誉)并且通过 Answer 发布它似乎不正确。

因此,问题在于使用两位数,或者更好的是,在脚本中指定 ALL,如下所示:

#!/bin/bash
p1=$1
p2=$2
p3=$3
p4=$4
p5=$5
p6=$6
if [[ $p2 == *"notify"* ]]; then
        p2=""
fi
/usr/bin/file-roller_orig $p1 $p2 $p3 $p4 $p5 $p6

该脚本旨在使用 Nautilus 中的 File Roller 上下文菜单选项禁用成功提取弹出窗口,并且成功做到了这一点。但是,它仅限于一次提取最多 4 个档案。由于我经常一次提取十几个或更多文件,并且看到p2=$2与通知绑定,我尝试添加p7=$7等等(我不是 CLI 专家),它确实提取了超过 4 个,但之后p9=$9(提取 7 个档案),它就停在那里了 - 我认为可能会发生这种情况,因为在 Gedit 中p10=10美元等等的颜色与其他的不同(我认为这不太好)。

那么我该如何进行输入p9=$9或者,更好的办法是,让脚本告诉 file-roller提取所有选定的档案?后者是理想的,因为即使我可以一次提取十几个文件,我也一定会想要在某个时候提取更多文件,而不必分批提取。非常感谢您的回答。干杯。

答案1

您可以使用"$@"来获取所有参数并shift N删除 N 个参数。

#!/bin/bash
p1="$1"
p2="$2"
shift 2
if [[ $p2 == *"notify"* ]]; then
        p2=""
fi
/usr/bin/file-roller_orig $p1 $p2 "$@"

使用双引号(例如"$1")引用变量是一个好主意,以确保 bash 不会尝试将一个变量用作多个参数。

尽管使用$@更好,但可以使用${10}来访问第十个参数。

答案2

我认为这种方法是有缺陷的,原因有以下几点。

最重要的是,它依赖于--notify作为命令的第二个位置参数给出。虽然从 nautilus 操作调用时可能会出现这种情况,但不能保证它会一直如此(如果file-roller在其他上下文中运行,当然也不能保证)。

其次,我们可以推断出,只有当参数未被引用时该方法才“有效”,因此您不想将替换值设置为空字符串 - 您想完全删除该参数。

我的建议是

#!/bin/bash

declare -a args

for arg do
  case $arg in
    "--notify") continue
    ;;
    *) args+=("$arg")
    ;;
  esac
done

/usr/bin/file-roller "${args[@]}"

PATH将其保存在比原始版本更早的某个位置/usr/bin/file-roller- 例如/usr/local/bin/file-roller(覆盖系统范围的默认行为)或~/bin/file-roller(仅为您的用户覆盖)。

相关内容