本期内容:
1 Linux Shell的变量2 Linux Shell的控制结构3 Linux Shell的函数4 Linux Shell在大数据中的应用
三、shell中变量和引用实战
1、变量可以分为三种类型,
1)本地变量:只在当前shell生命周期内有效;
2)环境变量:指在用户登录到注销对于所有的编辑器、脚本、进程都有效;
3)位置参数:主要适用于shell脚本传递参数,例如:./spark-shell --master spark://Master:7077
下面代码为:启动spark所有进程的脚本:start-all.sh
# Load the Spark configuration
. "${SPARK_HOME}/sbin/spark-config.sh"
# Start Master
"${SPARK_HOME}/sbin"/start-master.sh $TACHYON_STR
# Start Workers
"${SPARK_HOME}/sbin"/start-slaves.sh $TACHYON_STR
($:变量替换符号,即用当前的具体的值替换)
2、${variablename}会具体提取出变量的内容,当然可以把{}去掉,例如:$HADOOP_CONF_DIR来提取出Hadoop配置文件具体所在的路径的值;
3、变量赋值的时候“=”两边不能有空格,有空格会被认为执行Commod;
root@Master:~# variable2 = "I"
variable2: command not found
root@Master:~# TACHYON_STR=""
root@Master:~# TACHYON_STR= ""
: command not found
root@Master:~# i=1
如果访问变量,使用echo $variable_name 打印变量,例如下面:
oot@Master:~# spark="I Love U"
root@Master:~# echo $spark
I Love U
root@Master:~#
4、在shell中编写下面例子:
#!/bin/bash
#dingyi
a=100
let a+=10
echo "a=$a" #
将其授权并执行:
root@Master:~# vim compute.sh
root@Master:~# chmod u+x compute.sh
root@Master:~# ./compute.sh
a=110
root@Master:~#
强制把变量b变成整数类型:
b=xx08
echo "b=$b"
declare -i b
执行如下(可以看到对字符串类型变量b强制转换没有生效):
root@Master:~# ./compute.sh
a=110
b=xx08
root@Master:~#
5、环境变量(定义环境变量 后,希望别的用户使用,需要导出环境变量)
使用export关键字把变量变成环境变量,例如:
export JAVA_HOME=/usr/lib/java/jdk1.7.0_71
export JRE_HOME=${JAVA_HOME}/jre
export SCALA_HOME=/usr/lib/scala/scala-2.10.4
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.6.0
export SPARK_HOME=/usr/local/spark/spark-1.6.0-bin-hadoop2.6
export ZOOKEEPER_HOME=/usr/local/zookeeper/zookeeper-3.4.6
export CLASS_PATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
可以使用”env“命令查看系统中的环境变量,清除环境变量使用unset:
root@Master:~# env
XDG_VTNR=7
LC_PAPER=zh_CN.UTF-8
LC_ADDRESS=zh_CN.UTF-8
XDG_SESSION_ID=c2
SPARK_HOME=/usr/local/spark/spark-1.6.0-bin-hadoop2.6
XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/root
SELINUX_INIT=YES
LC_MONETARY=zh_CN.UTF-8
CLUTTER_IM_MODULE=xim
SESSION=ubuntu
GPG_AGENT_INFO=/run/user/0/keyring-T8H0hV/gpg:0:1
TERM=xterm
VTE_VERSION=3409
使用echo $文件名变量访问pwd目录:
root@Master:~# cd /usr/kongxr/download/
root@Master:/usr/kongxr/download# pwd
/usr/kongxr/download
root@Master:/usr/kongxr/download# echo $PWD
/usr/kongxr/download
root@Master:/usr/kongxr/download#
root@Master:/usr/kongxr/download# echo $OLDPWD
/root
root@Master:/usr/kongxr/download#
6、系统中核心的配置文件(常用的一些配置文件.bashrc,bash_profile,bash_logout),修改了系统文件后一般使用source使其立即生效。
7、位置参数:主要用于从命理行像shell脚本传递参数
具体而言,$1代表传入shell的第一个参数,$2代表传入的第二个参数,如果要代表全部参数,使用 $* 或者$@表示从第一个位置开始的全部参数,例如:在spark-shell中:
if [ -z "${SPARK_HOME}" ]; then
export SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi
stty -icanon min 1 -echo > /dev/null 2>&1
export SPARK_SUBMIT_OPTS="$SPARK_SUBMIT_OPTS -Djline.terminal=unix"
"${SPARK_HOME}"/bin/spark-submit --class org.apache.spark.repl.Main --name "Spark shell" "$@"
stty icanon echo > /dev/null 2>&1
else
export SPARK_SUBMIT_OPTS
"${SPARK_HOME}"/bin/spark-submit --class org.apache.spark.repl.Main --name "Spark shell" "$@"
fi
}
编写简单脚本说明:
$@:代表传递所有的参数(同
$*
)
$#:代表传到脚本中的参数的数量;
$$:脚本运行的进程号;
$?:代表命令退出的状态,0表示没有错误,非0表示有错误:
注:-ge代表>=
8、命令替换:将命令的输出作为值赋值给某个变量;
# Enter posix mode for bash
set -o posix
if [ -z "${SPARK_HOME}" ]; then
export SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi
export _SPARK_CMD_USAGE="Usage: ./bin/spark-shell [options]"
例如:
export SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)" 实际上使用pwd获得的值来取代dirname,并且如果使用${}则会对其进行实际求值,对我们的例子来说,pwd的值为“
/usr/local/spark/spark-1.6.0-bin-hadoop2.6/bin
” ,$0代表当前文件名称Spark-shell