精华内容
下载资源
问答
  • 因为这个是将test.sh作为参数传给sh(bash)命令执行的。这时不是test.sh自己来执行,而是被人家调用执行,所以不要执行权限。 [root@iz2ze720onwdpm0gqiky35z 51mn]# ls -lrt test.sh -r--r--r-- 1 root root 22...

    sh+脚本名称,可以不必事先设定shell的执行权限。因为这个是将test.sh作为参数传给sh(bash)命令来执行的。这时不是test.sh自己来执行,而是被人家调用执行,所以不要执行权限。

    [root@iz2ze720onwdpm0gqiky35z 51mn]# ls -lrt test.sh 
    -r--r--r-- 1 root root 22 Oct 14 22:34 test.sh
    [root@iz2ze720onwdpm0gqiky35z 51mn]# sh test.sh 
    hello world

    如果直接运行test.sh,就会报权限问题

    [root@iz2ze720onwdpm0gqiky35z 51mn]# ./test.sh 
    -bash: ./test.sh: Permission denied
    展开全文
  • Shell 脚本执行命令参数带空格

    千次阅读 2020-10-27 15:18:36
    事情的背景很简单、最终解决方案也很简单,但是,但是解决的过程可是...3、shell 中直接执行命令 java -jar -Dmessage="shanhy hello world" demo.jar 正常,但是实际的需求是其中的参数可以填写多个,且不固定! 总之

    事情的背景很简单、最终解决方案也很简单,但是,但是解决的过程可是苦了!
    此时百度、谷歌都没好使,不过问题最终还是得以解决。

    下面先还原一下需求场景:

    1、有一个 springboot 的 jar 程序 demo.jar
    2、通过接收外部参数来覆盖内部 properties 配置中 key 为 message 的值
    3、shell 中直接执行命令 java -jar -Dmessage="shanhy hello world" demo.jar 正常,但是实际的需求是其中的参数可以填写多个,且不固定! 总之实际要求是下面的脚本内容(用变量的方式)

    #!/bin/bash
    export MSG="shanhy hello world"
    export JAVA_OPTS="$JAVA_OPTS -Dmessage='$MSG'"
    java -jar $JAVA_OPTS demo.jar
    

    这段脚本,咋一看似乎没什么问题,但是实际执行起来是错误的,因为空格会截断命令!

    期间使用了好多种拼接的方法,包括使用 \ 转译 " 等等。

    过程就不赘述了,最终解决问题正确脚本内容如下:

    #!/bin/bash
    export MSG="shanhy hello world"
    export JAVA_OPTS="$JAVA_OPTS -Dmessage='$MSG'"
    echo "java -jar $JAVA_OPTS demo.jar"|sh
    

    通过脚本可以看出,使用 echo 输出脚本来达到自动执行的目的,一种很好的变通方式。


    上文用示例的方式模拟了需求场景并进行了解决,其实本文案例的真实需求是这样的:
    业务微服务配置文件中的 spring.datasource.validation-query 需要在 jar 包启动服务的时候传参提供,而启动文件是一个通用且固定的 startup.sh 文件,该文件内部仅接收 JAVA_OPTS 参数,所以 JAVA_OPTS=$JAVA_OPTS -Dspring.datasource.validation-query=SELECT 1 FROM DUAL 是在系统环境变量中配置的。

    如果你还有其他更好的办法,欢迎留言赐教。


    (END)

    展开全文
  • 执行 Shell 脚本时,向脚本传递参数脚本内获取参数的格式为:$n。 n代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推。 以下实例我们向脚本传递三个参数,并分别输出,其中$0为...

    目录

    (1)$n传递参数

    (2)处理参数特殊字符


    (1)$n传递参数

    在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。

    n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推。

    以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名:

    为脚本设置可执行权限,并执行脚本,输出结果如下所示:

    $ chmod +x test.sh
    
    $ ./test.sh 1 2 3
    
    Shell 传递参数实例!
    
    执行的文件名:./test.sh
    
    第一个参数为:1
    
    第二个参数为:2
    
    第三个参数为:3

     

    (2)处理参数特殊字符

    参数处理

    说明

    $# 

    传递到脚本的参数个数

    $*

    以一个单字符串显示所有向脚本传递的参数。

    如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

    $$ 

    脚本运行的当前进程ID号

    $! 

    后台运行的最后一个进程的ID号

    $@

    与$*相同,但是使用时加引号,并在引号中返回每个参数。

    如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。

    $- 

    显示Shell使用的当前选项,与set命令功能相同。

    $? 

    显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

    #!/bin/bash

    # author:菜鸟教程

    # url:www.runoob.com

    echo "Shell 传递参数实例!";

    echo "第一个参数为:$1";

    echo "参数个数为:$#";

    echo "传递的参数作为一个字符串显示:$*";

     

    执行脚本,输出结果如下所示:

    $ chmod +x test.sh

    $ ./test.sh 1 2 3

    Shell 传递参数实例!

    第一个参数为:1

    参数个数为:3

    传递的参数作为一个字符串显示:1 2 3

     

     

    展开全文
  • Shell脚本命令选项参数处理

    千次阅读 2017-09-17 10:43:58
    Shell脚本命令选项参数处理 Shell脚本参数处理主要分三种情况,下面我们一一演示说明。 1、不带选项的参数处理 首先,我们通过一个不带选项的参数处理脚本,让大家了解一下shell脚本的常用内置参数。 #!/bin...
    

    Shell脚本:命令选项参数处理

    Shell脚本的参数处理主要分三种情况,下面我们一一演示说明。

    1、不带选项的参数处理

    首先,我们通过一个不带选项的参数处理脚本,让大家了解一下Shell脚本的常用内置参数。

    #!/bin/bash

     

    echo $0    # 脚本名, 带执行时的路径,类似于C语言中的argv[0]

    echo $1    # 参数1

    echo $2    # 参数2

    echo $3    # 参数3, 以此类推

    echo $#    # 参数个数, 不包含脚本本身

    echo $@    # 参数列表

    echo $*     # $*$@相同, "$*""$@"不同, "$*"将所有参数解释为一个字符串, "$@"是一个参数数组.


    把上面这段脚本保存到arg.sh中,然后执行脚本将显示这些Shell内置参数值

    [root@HLZ arg_proc]# dos2unix *.sh     # 语系转换为类unix方格

    dos2unix:converting file arg.sh to UNIX format ...

    [root@HLZ arg_proc]# ./arg.sh z yy zzz jkl

    ./arg.sh

    z

    yy

    zzz

    4

    z yy zzz jkl

    z yy zzz jkl

    显然地,不带选项的参数处理可以满足固定参数的脚本编写需求,但是对于可变参数或者复杂参数情况,就需要脚本中带选项的参数处理方式了!


    2、短选项参数处理

    Shell脚本中短选项参数的处理,完全可以使用while…shift…语句实现。当然,此处为了简化步骤,我们借助bash的内置命令getopts实现。

    #!/bin/bash

     

    # 选项后面不带:表示无参数, :表示有参数

    while getopts "ab:" arg

    do

            case $arg in

                      a)

                               echo "Optiona";;

                      b)

                               echo "Option b: ${OPTARG}";;

            esac

    done

     

    shift $((OPTIND-1))  #执行该语句,以便本脚本后面固定参数序号从$1开始.

    echo "Process arg: $1"

    echo "Process arg: $2"

    将上面这段脚本保存到getopts.sh中,然后执行:

    [root@HLZ arg_proc]# dos2unix *.sh

    dos2unix:converting file getopts.sh to UNIX format ...

    [root@HLZ arg_proc]# ./getopts.sh -b xyz -a arg1 arg2    #2.1

    Optionb: xyz

    Option a

    Process arg: arg1

    Process arg: arg2

    [root@HLZ arg_proc]# ./getopts.sh -b xyz -a -c arg1 arg2   #2.2

    Optionb: xyz

    Optiona

    ./getopts.sh: illegal option -- c  #对于不支持的选项,由getopts报错.

    Processarg: arg1

    Processarg: arg2

    [root@HLZ arg_proc]#./getopts.sh -b -a xyz arg1 arg2   #2.3

    Option b: -a

    Process arg: xyz

    Process arg: arg1

    如例2.3所示,对于不支持的选项,getopts会报错,但不退出而是继续执行。

    执行脚本时,对选项参数是没有顺序要求的,但是如例2.3所示,-b选项实现时是要求带参数的,但是执行时没有带参数,导致getopts把后面的-a解析为参数了,而且解析不到-a选项了!!这是由于执行时参数输入错误导致的,当然为了增强脚本的鲁棒性,可以对选项-b的参数进一步做个判断:若参数是本脚本的另一个选项,则报错退出。

    带短选项参数的处理方式基本能够满足shell脚本的写作需求。

    当然为了脚本选项参数的意义更加简明易懂,我们接下来继续介绍长选项参数的处理方法。


    3、长选项参数处理

    Shell脚本长短选项参数的处理,使用getoptwhile…shift…语句实现。

    #!/bin/bash

     

    # -o--options, 后面接短选项;  -l--long, 后面接长选项;

    # 多个长选项之间用,分隔, 类似于短选项, 选项后面不带:表示无参数, 1:表示有参数, 而带2::表示参数可有可无.

    ARGS=`getopt -o xy:z:: -l xlong,ylong:,zlong:: -n 'getopt.sh' -- "$@"`

    if [ $? != 0 ]; then

            exit 1

    fi

     

    eval set -- "${ARGS}"    # 将规范化的参数分配至位置参数($1,$2,...)

     

    while true

    do

            case $1 in

                      -x|--xlong)

                               echo "Option x"; shift;;

                      -y|--ylong)

                               echo "Option y: $2"; shift 2;;

                      -z|--zlong)

                               case $2 in

                                        "")

                                                  echo "Option z: no argument"; shift;;

                                        *)

                                                  echo "Option z: $2"; shift 2;;

                               esac;;

                      --)

                               shift; break;;

            esac

    done

     

    # 处理剩余参数

    for arg in $@

    do

            echo "Process $arg"

    done

    将上面这段脚本保存到getopt.sh中,然后执行:

    [root@HLZ arg_proc]# dos2unix *.sh

    dos2unix:converting file getopt.sh to UNIX format ...

    [root@HLZ arg_proc]# ./getopt.sh -x -y 123 -z456 arg1 arg2   #3.1

    Option x

    Option y: 123

    Option z: 456

    Process arg1

    Process arg2

    [root@HLZ arg_proc]# ./getopt.sh --ylong 123 -x --zlong=456 arg1 arg2   #3.2

    Option y: 123

    Option x

    Option z: 456

    Process arg1

    Process arg2

    [root@HLZ arg_proc]# ./getopt.sh --ylong 123 -v --zlong=456 arg1 arg2  #3.3

    getopt.sh:invalid option -- 'v'

    [root@HLZ arg_proc]# ./getopt.sh --ylong -x arg1 --zlong=456 arg2   #3.4

    Option y: -x

    Option z: 456

    Process arg1

    Process arg2

    如上面执行结果所示:

    3.1中,选项与参数之间一般用空格隔开,但是-z与参数456之间没有空格,而选项参数能正常解析,是因为语句eval set -- "${ARGS}"起了作用。

    3.2中,可以看出长选项参数于选项之间即可用空格间隔,亦可直接用=号,即--zlong=456

    3.3中,对于不支持的选项,如上面的-vgetopt将报错并直接退出,这是与getopts不同的地方。

    3.4中,首先,类似于短选项参数存在的问题,--ylong选项实现时是要求带参数的,但是执行时没有带参数,导致把后面的-x解析为参数,而解析不到-x选项了。同样的解决方法,对选项参数做个判断:若参数是本脚本的另一个选项,则报错退出。其次,由执行结果可见,getopt会把非选项参数按照原有参数顺序,归类并有序放在选项参数之后,如arg1 arg2

    getopts不同的是,getopt是一个独立可执行程序,更详细说明可通过man getopt查看。

     

    
    展开全文
  • 脚本执行命令实例详解

    万次阅读 2018-07-02 10:33:49
    a.sh执行,有时见到用sh a.sh执行,或者bash a.sh,或者source a.sh,那么这两种执行脚本的方式有什么区别呢?这个问题也困惑了本人很久,今天总结一下: 首先考虑这样子一种情况: 我的作用文件有时候路径比较...
  • 这几个命令都是执行脚本的语句 ,均可以带参数执行,和普通的脚本作用相同 。 . filename(注意之间有个空格)和source filename的作用是相同的 ,相当于在当前的shell中将文件中的语句一个个执行一遍,相当于把...
  • linux双击执行sh脚本

    2021-03-31 19:07:07
    文章目录linux双击执行sh脚本1、在桌面上新建一个Auto.sh脚本文件2、打开终端在桌面目录下执行以下命令进行权限设置:3、设置Terminal启动命令4、双击启动程序开机自启程序1、在home搜索:start,如下图所示:2、...
  • 背景  执行.sh脚本时出现$’\r’: 未找到命令, 原因  是因为命令直接从windows 复制过来导致的 解决  yum install dos2unix  dos2unix **.sh 进行转换  再次执行即可 ...
  • shell脚本快速执行命令

    千次阅读 2019-03-24 11:26:02
    shell脚本快速执行命令1.gnome-terminal2.基本用法3.启动后自动执行命令4.demo15.demo2 1.gnome-terminal 常用,置顶: gnome-terminal -x bash -c "子终端要执行命令1;2;...." gnome-terminal -t "title-name" -x...
  • 如何运行.sh脚本文件

    千次阅读 2020-08-01 13:59:31
    如何运行.sh脚本文件
  • android开发笔记之sh脚本

    万次阅读 2016-05-15 11:02:44
    执行sh脚本当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 要使脚本可执行: Sh代码chmod +x filename或者sudo chmod 777 filename然后,您可以通过输入下面二个命令的一个来执行您的脚本。 ./filename...
  • 一、示例如下: 1、执行远程脚本命令如下: ...结果返回1:脚本执行成功了 结果返回0:脚本执行失败了 sh /home/pythonwork/operate_parameters.sh "hello" "zhangsan" 二、java代码如...
  • linux .sh脚本中的一些常用命令

    千次阅读 2015-07-20 15:12:36
    用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh执行程序。 当编写脚本完成时,如果要执行脚本,还必须使其可执行。 要使编写脚本执行: 编译 chmod +x filename 这样才能用...
  • linux中不同脚本获取命令参数个数

    千次阅读 2019-04-10 11:33:49
    有时候我们需要从命令行获取脚本参数个数,如果不满足,那么退出不再继续该执行脚本。 bash与shell脚本 csh脚本 expect脚本 bash或者shell脚本:使用 “$#” 返回参数个数,定义变量使用 first_arg=$1 无需...
  • build.sh脚本

    万次阅读 2017-11-01 18:13:25
    用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh执行程序。 当编写脚本完成时,如果要执行脚本,还必须使其可执行。 要使编写脚本执行: 编译chmod +x filename这样才能用./...
  • 详解:Shell脚本变量判断参数命令

    千次阅读 2018-05-22 09:22:35
    系统变量$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2 ...$0 正在被执行命令的名字。对于shell脚本而言,这是被激活命令的路径 $@ 被双引号...
  • ubuntu运行sh脚本sudo自动输入密码

    万次阅读 2017-05-10 14:37:43
    第一种方法:使用管道(上一个命令的 stdout 接到下一个命令的 stdin): #!/bin/bash echo password | sudo -S apt-get update第二种方法 使用文本块输入重定向: 第二种方法: #!/bin/bash sudo -S apt-get update ...
  • 输出运行状态:./start.sh status 二、编写脚本 1、创建文件 start.sh 文件放至 jar 同目录 2、添加内容 #!/bin/bash #这里可替换为你自己的执行程序,其他代码无需更改 APP_NAME=txlcn-tm-5.0.2.REL...
  • 首先,bash命令参数说明: -n:不会执行脚本,仅查询脚本语法是否有问题,并给出错误提示。 -v:在执行脚本时,先将脚本的内容输出到屏幕上,然后执行脚本,如果有错误,也会给错误提示。 -x:将执行脚本内容...
  • sh 命令重要参数

    千次阅读 2017-11-16 22:17:00
    sh使用“-n”选项进行shell脚本的语法检查,使用“-x”选项实现shell脚本逐条语句的跟踪,巧妙地利用shell的内置变量增强“-x”选项的输出信息等。 本文转自 fenghao.cn 51CTO博客,原文链接:...
  • windows下执行.sh脚本

    万次阅读 2017-10-17 14:40:20
    现在开发项目遇到一个问题,mac系统和windows下开发,对于mac下的sh脚本,想要在windows下也能正常执行,通过了解,安装cygwin,Cygwin是一个在windows平台上运行的类UNIX模拟环境 基本操作命令: ls #以默认...
  • SH脚本入门总结

    千次阅读 2016-11-11 09:45:06
    把学到sh脚本相关知识总结如下: #!/bin/bash 注明用什么运行 #!/bin/sh  Chmod +xfilename 使得脚本有权限执行 变量名不需要定义,直接赋值使用双引号,lua脚本和sh脚本都是这样的,也可以使用语句赋值,...
  • 1.执行bat脚本 (1)传入参数 bat处理文件中可引用的参数为%0~%9,%0是指批处理文件的本身,也可以说是一个外部命令;%1~%9是批处理参数,也称形参,例如:新建一个文件test_argv.bat,文件内...
  • Mac下定时执行python脚本&sh脚本

    千次阅读 2017-10-18 13:52:15
    2.保存,退出,脚本即可按照指定的时间去执行脚本注意: (1)时间的格式 * * * * * command 分 时 日 月 周 命令 第1列表示分钟1~59 每分钟用或者 /1表示 第2列表示小时1~23(0表示0点) 第3列...
  • 执行脚本的时候,比如发布程序的时候,希望能在程序运行的时候带上程序运行的环境变量,如dev、live等,此时可以往脚本中添加参数: 可以使用系统定义的位置变量,位置变量是一类比较特殊的变量,引用脚本参数时,...
  • 看懂sh脚本

    2019-10-07 12:21:52
    用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh执行程序。 当编写脚本完成时,如果要执行脚本,还必须使其可执行。 要使编写脚本执行: 编译 chmod +x filename 这样才能用...
  • build.sh脚本文件 #!/bin/bash # 1.该行是如果出现错误,就退出脚本执行 set -e # ---设置基本环境变量start--------------------- export LC_ALL=en_US.UTF-8 # 1. BASH_SOURCE[0]等价于BASH_SOURCE,取得当前...
  • 注意,expectin文件命名为.exp,实际文件类型就是shell,在执行该脚本语言时,入参与调用shell脚本一致,可以通过参数获取 [lindex $argv 0] 以下脚本的作用是登录指定IP的主机,到RUN_PATH 目录下执行sh脚本文件 ...
  • linux开机自动执行.sh脚本

    万次阅读 2018-05-10 23:36:13
    编写开机自动执行脚本auto.sh #!/bin/sh #chkconfig: 2345 20 80 #description:Server reboot.Execute auto.sh #client post port 80 redirect 9527 #sudo iptables -A PREROUTING -t nat -i eth0 -p tcp —...
  • 假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限。 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本:此种方法为阿里云推荐 cd /data/shell ./...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 163,195
精华内容 65,278
关键字:

sh脚本执行命令参数