是因为函数在bash脚本中创建了一个子shell,子shell会继承父shell的环境变量,但是在函数内部对环境变量的修改不会影响到父shell的环境变量。
为了解决这个问题,可以使用export命令将环境变量导出到子shell中。具体步骤如下:
这样就可以在函数内部正确地访问到传递给bash脚本的环境变量了。
关于bash脚本和环境变量的更多信息,可以参考腾讯云云服务器CVM产品的文档:
https://blog.csdn.net/10km/article/details/50427281 linux shell中判断目录是否为空 #!.../bin/sh ##方法一 判断输出字符数统计为0 is_empty_dir(){ return `ls -A $1|wc -w` } ##方法二 判断输出string为空 #is_empty_dir...is_empty_dir $1 then echo " $1 is empty" else echo " $1 is not empty" fi 上面两个方法都是使用《ls命令》列出目录下的文件...,根据ls的输出来判断是否为空,注意ls 命令带了-A参数,这是为了将目录中隐藏文件列出,同时排除.和.....,如果不加这个参数,判断结果是不准确的。
VARIABLE= value # 脚本将会尝试运行 "value" 命令,同时设置环境变量 "VARIABLE" 为 ""。 上面 $b 和 $c 的区别?...but empty'; # 设置但为空 else echo 'b is not set'; # 没设置,如 c fi ``` 变量中的空格 e=1 2 3 # 报错,变量中间当然不能有空格 e=...转义,变量不会被替换 变量类型 这里当然不是说字符串、整形什么的,其实 bash 中的变量都可以理解为字符串。 bash 中有四种类型的变量,它们是环境变量、本地变量、位置变量和特殊变量。...环境变量 参看维基百科的环境变量,这里不做赘述。 本地变量 我们上面的那么多的例子其实就是本地变量。 本地变量的作用域为当前脚本。有一个子类,局部变量,作用域是当前代码块,比如函数中的变量。...echo "${10}" 特殊变量 变量 含义 $$ 表示当前 Shell 进程的 ID ,即 pid $n 上述位置变量 $# 传递给脚本或函数的参数个数 $* 传递给脚本或函数的所有参数 $@ 传递给脚本或函数的所有参数
1.环境变量 Shell执行环境由一系列环境变量组成,这些变量是由shell维护和管理的,变量名由大写字母或数字组成,可被用户重新定义。...如: "$#" 记录传递给shell的自变量个数 "$*" 传递给脚本或函数的所有参数 $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n"...若 $file 没设定,则回传 txt ,并将 $file 赋值为txt,空值及非空值不作处理 ${file:=txt} 若 $file 没设定或空值,则回传 txt ,将 $file...exit类似,作用是跳出函数;在函数中使用 exit会退出整个shell脚本,而不是退出函数; exitn:退出当前shell程序,n为返回值 returnn:用于函数中,n是函数的返回值,用于判断函数执行是否正确.../等形式的相对变量,使用之后脚本的移植性将变得极差,另外如果脚本放在crontab内运行,相对路径基本无法识别。
环境变量 :所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。...特殊变量 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 $# 传递给脚本或函数的参数个数。...$* 传递给脚本或函数的所有参数。 $@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同 $? 上个命令的退出状态,或函数的返回值。 $$ 当前Shell进程ID。...* 和 @ 的区别: * 和 @ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"1" " 但是当它们被双引号(" “)包含时,”2 … n"的形式输出所有参数;“@” 会将各个参数分开.../bin/bash a=11 echo "a is $a \n" echo -e "a is $a \n" a is 11 \n a is 11 6、命令替换 变量替换可以根据变量的状态(是否为空、
加载器的理解: argv这个参数会被传递给ls,其实exec系列接口含义也是如此,在命令行参数中,有所的进程都是bash的子进程,所以exec其实就是一个代码级别的加载器,他可以做到将可执行程序的代码和数据导入到内存中...,然后再调用main函数的时候将argc参数传递给程序,其实就相当于是你在执行该程序之前,优先给你加载出来一个栈帧结构。...脚本语言不是脚本在跑,而是由解释器来解释执行 我们想要执行脚本文件的话,路径传的就不是脚本文件,而是脚本文件的解释器, bash+test.sh则是作为命令行参数。 ...(1)任何语言都有像exec这类的接口 (2)语言可以互相调用的原因是 无论是什么语言写的程序 在操作系统看来都是进程 1.5.3 将命令行参数和环境变量传递给另一个程序 环境变量是在子进程创建的时候就默认继承了...1.5.4 子进程环境变量的处理 1、新增环境变量——>putenv 如果我们想给子进程创建新的环境变量,之前我并不想在bash上搞,因为在bash上搞的话所有进程都会被影响。
.来表示,用于脚本代码中调用通过命令行参数传递给它的参数 特殊变量:$?...declare -r name declare -ir name ( i表示数字 ) 查看:readonly -p 例如:PI = 3.1415926 位置变量:在脚本代码中调用通过命令行传递给脚本的参数.......") $@ :传递给脚本的所有参数,每个参数为独立字符串 ( "string1" "string2" "string3" ... ) $# :传递给脚本的参数的个数 $@ $* :只有在被双引号引起来的时候才会有差异...etc/profile --> /etc/profile.d/*.sh(登录就会执行,如果你想要配置的服务开机执行什么脚本就可以放在这里)*/ --> ~/.bash_profile (放环境变量)--...(别名和函数本地变量) --> /etc/bashrc --> /etc/profile.d/*.sh .bash_profile:定义环境变量和开机启动项 source (.) scriptnaem
:传递给脚本或函数的参数,n是一个数字,表示第几个参数 例如第一个参数是1,第二个参数是2。...$#:传递给脚本或函数的参数个数 $*:传递给脚本或函数的所有参数 @:传递给脚本或函数的所有参数,当被双引号""包含时, $?...:上个命令的退出状态或者获取函数的返回值 $$:当前shell进程ID,对于Shell脚本,就是这些脚本所在进程的ID 8、字符串的拼接 var=$(pwd)aaa 并排放,直接加在后面 9、...-n str:判断字符串str是否为非空 =和==:判断字符串str是否相等 -d filename:判断文件是否存在,并且是否command1为目录文件 -f filename:判断文件是否存在,并且是否为普通文件...my_name #调用函数 19、环境变量 全部用户、全部进程共享的变量:/etc/bash.bashrc 一个用户、全部进程共享的变量:~/.bashrc Shell
bash是Linux和Unix下的shell。 本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。...环境变量:::所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。...字符串 字符串定义 bash中的字符串可以用单引号和双引号,其区别就是,单引号内不能解释变量,而双引号内可以解释变量 name="jianjian" echo '$name' echo "$name"...传参 使用方法 我们在使用脚本文件的时候可以向文件中传递一些参数,脚本则可以使用n这种方式来获取参数,n这种方式来获取参数,0代表文件名,1代表的是第一个参数,1代表的是第一个参数,2代表第二个参数,以此类推...return .... } 参数列表 与文件传参类似,函数也是使用相同的语法来传参,取参 test(){ echo 第一个参数为$1 echo 第二个参数为$2 ...
=value “导出” varname=value export varname 脚本在执行时会启动一个子shell进程, 命令行中启动的脚本就会继承当前shell环境变量 系统自动执行的脚本...可以自定义回传码(命令执行状态码),没有跟数字,默认最后一次执行的状态码。...bash变量的类型: 本地变量(局部变量):作用域只是当前shell 环境变量:作用域是当前shell,及其子shell 位置变量:$1,$2,$3.... shift:轮替 位置参数的轮替。...> < => <= -n string :测试指定字符串是否为空,空为真,不空为假。 -s string :测试指定字符串是否为空,空为假,不空为真。 #!/bin/bash if !...执行状态结果 bash -x *.sh 逐步执行显示 注意:执行结果,状态结果 函数的执行状态结果是最后一条命令的执行结果的状态返回值。
Shell 函数必须先定义后使用 Shell 函数与其他高级语言的函数有相似之处,也有返回值、删除函数、在终端调用函数(传参和递归)等等....如果一定要让函数返回字符串,那么可以先定义一个变量,用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值 实际案例: #!...#执行结果# [返回空值] this is aa, this is bb this is cc 函数返回值为:0 函数参数 在Shell中,调用函数时可以向其传递参数,在函数体内部,通过 n 的形式来获取参数的值...# 传递给函数的单个参数 } funWithParam 1 2 3 4 5 6 7 8 9 34 73 #注意这里传递给函数的参数 WeiyiGeek.函数参数传递 递归函数 bash也支持递归函数...来获取执行的结果; shell中函数传参与脚本传参是一致的,但是得注意 $0 代表任然是父脚本的名称; 删除函数 描述:像删除变量一样,删除函数也可以使用 unset 命令,不过要加上 .f 选项,如下所示
在shell文件的行首,作为include标记,#!/bin/bash;其他地方作为注释使用 5. ;分号 语句的分隔符。在shell文件一行写多条语句时,使用分号分割。 6. ;; 双分号。...在使用case选项的时候,作为每个选项的终结符。在Bash version 4+ 的时候,还可以使用[;;&], [;&] 7. .英文句点号 命令等价于source, . 表示当前目录 ...../bin/bash; . data-file#包含data-file; (2)作为文件名的一部分,在文件名的开头,表示该文件为隐藏文件,ls一般不显示出来(ls -a 可以显示); (3)作为目录名,一个点代表当前目录...当前脚本的名称 16. $# 传递给脚本或函数的参数个数 17. $* 传递给脚本或函数的所有参数 18. $@ 传递给脚本或函数的所有参数。...上个命令的退出状态,或函数的返回值。 20. $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 21. $n 传递给脚本或函数的参数。
/文件名.sh创建shell脚本文件在创建shell脚本文件时,必须在文件的第一行指定要使用的shell。其格式为:#!/bin/bash在通常的shell脚本中,井号(#)用作注释行。...2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。...(哪个字母先出现就计算哪个)echo `date`双引号里可以出现转义字符传递参数在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。...该脚本会获取dbl函数的输出,而不是查看退出状态码。在函数中使用变量函数可以使用标准的参数环境变量来表示命令行上传给函数的参数。...在函数中处理变量全局变量:在shell脚本中任何地方都有效的变量。默认情况下,你在脚本中定义的任何变量都是全局变量。局部变量:无需在函数中使用全局变量,函数内部使用的任何变量都可以被声明成局部变量。
bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行。...2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。...一般Shell变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。 特殊变量列表 变量 含义$0当前脚本的文件名$n传递给脚本或函数的参数。...$#传递给脚本或函数的参数个数。$*传递给脚本或函数的所有参数。$@传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。$?上个命令的退出状态,或函数的返回值。...如果一定要让函数返回字符串,那么可以先定义一个变量,用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值。 调用函数只需要给出函数名,不需要加括号。
2. bash 启动 bash 启动脚本是 bash 启动时会自动执行的脚本,因此用户可以把一些环境变量的设置和 alias、umask 设置等放到启动脚本中,这样每次启动 shell 时都会自动生效。...如果终端或远程登录,那么登录 Shell 是该用户的所有其他进程的父进程,所以环境变量在登录 Shell 的启动脚本里设置一次就可以自动带到其他非登录 Shell 里,而本地变量、函数、 alias 等设置没有办法带到子...Shell里,需要每次启动非登录Shell时设置一遍,所以就需要有非登录Shell的启动脚本,所以一般来说在 ~/.bash_profile 里设置环境变量,在 ~/.bashrc 里设置本地变量、函数...非交互式启动 为了执行脚本而 fork 出来的子 Shell 是非交互式 Shell,启动时执行的脚本文件有环境变量 BASH_ENV 定义,相当于执行下面的命令: if [ -n "$BASH_ENV...Shell函数没有参数列表并不表示不能传参数,事实上,函数就像是迷你脚本,调用函数时可以传任意个参数,在函数内同样是用 0 、 1 、 2 等变量来提取参数,函数中的位置参数相当于函数的局部变量,改变这些变量并不会影响函数外面的
onExit 其实这个脚本只能看出来是调用了spark-submit,后续会再分析一下spark-submit的作用(它里面会调用spark-class,这才是执行方法的最终执行者,前面都是传参而已)。....; pwd)" fi 这句在很多启动脚本中也比较常见,即获取应用的主目录。...if [ -z $string ] 如果string 为空 if [ $sting ] 如果string 非空,返回0 (和-n类似)...所以上面的那句判断,就是检查${SPARK_HOME}是否为空的意思。...首先$0是shell中的变量符号,类似的还有很多: $# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表
, 用户的环境变量~/.bash_profile ~....也可在/profile.d/xx.sh 内如可写echo “xxx自定义提示信息”。即可加入x执行权限。注意:定时任务。环境变量需要重新定义。 (1)....删除变量: unset 如:unset your_name Shell特殊变量: 特殊变量列表变量含义$0当前脚本的文件名$n传递给脚本或函数的参数。n 是一个数字,表示第几个参数。...$#传递给脚本或函数的参数个数。$*传递给脚本或函数的所有参数。$@传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。$?上个命令的退出状态,或函数的返回值。...$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。
我们最长见的应该算是bash了。 2.Shell常见特殊字符 Shell的特殊字符非常的繁杂,各种特殊的符号在我们编写Shell脚本的时候如果能够用得好,往往能起到事半功倍的效果。...2.1 特殊变量 序号 符号 作用 示例 1 $0 当前脚本的名称 2 $# 传递给脚本或函数的参数个数 3 $* 传递给脚本或函数的所有参数 4 $@ 传递给脚本或函数的所有参数。...上个命令的退出状态,或函数的返回值。 6 $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 7 $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。...如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。若此替换出现在Shell脚本中,那么脚本将停止运行。...var=/home/centos;echo ${var//o/h}结果为/hhme/cenths 31 $[] 整数扩展(integer expansion),在方括号内执行整数表达式并返回结果。
:后台运行的最后一个进程的pid $_:之前命令的最后一个参数 shell 中的变量还有一点特性,可以设置默认值,即为了防止一些意外导致变量成为空值而导致脚本崩溃。...当 Shell 子进程产生时,它会继承父进程的环境变量为自己所用,所以说环境变量可从父进程传给子进程。不难理解,环境变量还可以传递给孙进程。...注意,两个没有父子关系的 Shell 进程是不能传递环境变量的,并且环境变量只能向下传递而不能向上传递,即“传子不传父”。...注意:在执行时要赋权限 补充知识点: 一个规范的Shell脚本在第一行会指出由哪个程序(解释器)来执行脚本中的内容,这一行内容在Linux bash的编程一般为: #!/bin/bash 或 #!.../bin/sh sh为bash的软链接,大多数情况下,脚本的开头使用“#! /bin/bash”和“#! /bin/sh”是没有区别的。
main函数的第一个参数为argc,参数类型为int,第二个参数为argv,参数类型为char*类型的指针数组(也叫命令行参数表),该指针数组以NULL结尾。...解释器还会计算选项的数量,并将其作为argc的值传递给main函数。命令行解释器会负责将这些信息正确地传递给程序的main函数,以便程序能够使用它们。...8 printf("%d, %s\n", i, argv[i]); 9 } 10 return 0; 11 } 有了命令行参数表,我们就可以通过在命令行中传不同的选项...三、main函数的第三个参数 其实main函数最多可以传递三个参数,第三个参数叫env,参数类型同样为char*的指针数组,env数组中保存的正是该进程拥有的环境变量。...env表的起始地址传递给我们程序的main函数的env参数,此时我们的进程也就拿到了父进程给我们的环境变量。
领取专属 10元无门槛券
手把手带您无忧上云