如何给 sh -c "echo $1,$2" 传递参数。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Jamy
V2EX    Linux

如何给 sh -c "echo $1,$2" 传递参数。

  •  
  •   Jamy 2023-01-11 21:32:18 +08:00 2228 次点击
    这是一个创建于 1029 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一段 shell 脚本,不想写到文件再去执行,如何传递参数?

    15 条回复    2023-01-13 15:41:20 +08:00
    hsfzxjy
        1
    hsfzxjy  
       2023-01-11 21:33:01 +08:00 via Android
    写成 shell 函数?
    n0099
        2
    n0099  
       2023-01-11 21:36:16 +08:00   1
    https://unix.stackexchange.com/questions/144514/add-arguments-to-bash-c
    第一个回答的机翻:

    /bin/bash -c 'echo "$0" "$1"' foo bar
    /bin/bash -c 'echo "$@"' bash foo bar
    在第一种情况下,显式传递 echo 参数$0 和$1 ,在第二种情况下,使用"$@"to 正常扩展为“除 $0 之外的所有位置参数”。请注意,在这种情况下,我们也必须传递一些要使用的东西$0 ;我选择了“bash”,因为这$0 通常是什么,但其他任何东西都可以。

    至于这样做的原因,而不是仅仅将您直接提供的任何参数传递给您列出的命令:请注意文档说“命令是从字符串中读取的”,复数形式。换句话说,这个方案允许你做:

    /bin/bash -c 'mkdir -p -- "$1" && cd -P -- "$1" && touch -- "$2"' bash dir file
    ab
        3
    ab  
       2023-01-11 21:36:51 +08:00
    bash test.sh abc 123
    ab
        4
    ab  
       2023-01-11 21:38:20 +08:00
    抱歉没注意到是不想写到文件
    Nooooobycat
        5
    Nooooobycat  
       2023-01-11 21:39:58 +08:00
    man xargs
    Jamy
        6
    Jamy  
    OP
       2023-01-11 21:58:49 +08:00
    @h0099
    非常感谢,果然可以!
    sh -c 'echo $1 $2 $3 $4 $5' sh 1 2 3 4 5
    webcape233
        7
    webcape233  
       2023-01-11 22:30:05 +08:00 via iPhone
    我寻思这不就是直接写完事吗?还用想啥特殊办法

    a=1 ; sh -c "echo $a"
    1
    webcape233
        8
    webcape233  
       2023-01-11 22:33:24 +08:00 via iPhone
    搞不懂既然不写文件,直接在终端的,传参意义是啥,先声明再调用不一样? 为啥要用 sh -c 呢
    n0099
        9
    n0099  
       2023-01-11 22:42:07 +08:00
    @webcape233 估计他复制粘贴来的 bash 里有一大堆的$1 $2 $3 $4 $5 $6 $7 $8 $9 他懒得查找替换,而您又不可能声明 1=a ( bash 变量名不能数字开头)
    Jamy
        10
    Jamy  
    OP
       2023-01-12 18:53:33 +08:00
    @h0099 由于安全原因,脚本文件是加密的, 有一个 c 写的程序来调用, 解密完成之后就要立即执行.这时候不方便写个文件再删除了
    Jamy
        11
    Jamy  
    OP
       2023-01-12 18:54:46 +08:00
    @webcape233 是有 C 程序来调用的,并非在终端下执行
    Jamy
        12
    Jamy  
    OP
       2023-01-12 19:12:59 +08:00
    鉴于大家对于这个需求的疑惑, 我再解释下需求吧.
    由于安全原因,需要把正常的 shell 脚本(encrypt.sh)用 aes 加密,
    然后再用 C 写一个程序来(shc)来执行这个加密的 shell 文件.
    要实现的效果就是调用 shc encrypt.sh 1 2 3 可能正常执行脚本.

    根据#2 楼 @h0099 指点,最终的 shc 的实现过程大概如下
    ```c
    int main(int argc, char* argv[]) {
    char* nargv[32] = {0};
    char *decrpytShell = "echo $1 $2";
    nargv[0] = argv[0];
    nargv[1] = "-c";
    nargv[2] = decrpytShell ;
    nargv[3] = argv[0];

    for(int i = 2; i < argc; ++i)
    nargv[i + 2] = argv[i];

    return execvp("/usr/bin/sh", nargv);
    }
    ```
    n0099
        13
    n0099  
       2023-01-12 19:46:32 +08:00
    那您 c 写的 shc 解密程序里不也有 aes 加密时的密钥吗?您在同一个机器上加密又解密一坨 bash 字符串有啥意义?
    除非您是在执行别人发给您的 bash ,而为了信任对方发送的 bash 的确是他亲自发的所以套了层 GPG
    Jamy
        14
    Jamy  
    OP
       2023-01-13 09:47:27 +08:00
    @h0099 肯定是分发到不信任的环境里执行的啊,shc 又经过混淆加密处理,看他破解能力了.
    n0099
        15
    n0099  
       2023-01-13 15:41:20 +08:00
    所以拥有 aes 解密密钥的 shc 程序并不位于`不信任的环境`之中?
    shc 只是负责解密变回合法 bash 字符串后把 bash 字符串传给`不信任的环境`来 eval ?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5889 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 95ms UTC 02:22 PVG 10:22 LAX 18:22 JFK 21:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86