[linux] 新增一个用户
groupadd -g 1000 kentgroup #先生成一个组 useradd -g 1000 kent #生成账号 passwd kent #为新账号生成密码
groupadd -g 1000 kentgroup #先生成一个组 useradd -g 1000 kent #生成账号 passwd kent #为新账号生成密码
#!/bin/sh JPDA_ADDRESS=5566 JPDA_SUSPEND=n # Only set CATALINA_HOME if not already set #这里利用了 && 的短路功能 #catalina.sh是在bin目录下,cd "$PRGDIR/.."的作用下是跳到bin目录的上级目录,这时再执行pwd即可得tomcat的目录 [ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd` # Copy CATALINA_BASE from CATALINA_HOME if not already set [ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME" if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then #setenv.sh存在并且当前用户有可读权限 . "$CATALINA_BASE/bin/setenv.sh" #执行一下setenv.sh,点号在这里的作用是临时执行一下脚本但不改变脚本文件的执行权限 elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; …
"command substitution"会丢失trailing newlines 如果你要使用"command substitution",确保这个command只会输出单行结果
让我们一起来欣赏一下tomcat的启动脚本是怎么写的,重点关注一下其中的shell技巧 #!/bin/sh #将用sh shell执行 PRG="$0" #当前命令,即startup.sh while [ -h "$PRG" ] ; do #-h同-L,用于判断文件是否是符号连接;这段代码用于找到连接背后的真实文件;由于连接的target本身可能也是个连接,所以这里用while循环找出终极连接指向的真实文件 ls=`ls -ld "$PRG"` #为了找出本连接的target,需要执行一下ls命令;这里暂时先把ls命令的输出赋给$ls变量 link=`expr "$ls" : ‘.*-> \(.*\)$’` #通过expr的模式匹配功能,找出$ls中的target部分,并赋给$link变量 if expr "$link" : ‘/.*’ > /dev/null; then #判断$link是否以"/"开头,如果是,则它就是一个完整的路径;这里的> /dev/null是为了使expr的输出不打印在屏幕上 PRG="$link" else PRG=`dirname "$PRG"`/"$link" #如果$link没有以"/"开头,那它就是一个相对路径;也就是说target的完整路径 = 符号连接的目录/相对路径 fi done PRGDIR=`dirname "$PRG"` #得出真实命令文件所处的目录 EXECUTABLE=catalina.sh if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then #判断一下catalina.sh是否存在且可执行 …
#!/bin/sh #eval: 动态执行命令 command=$1 eval $command #把shell脚本的第一个参数作为命令来执行,如"shell.sh ls"将执行"ls" #用":"代表空操作 if [ 1 -eq 1 ] ; then : #啥也不干 else echo not true fi #用type, which打印一个命令的完整路径 type java which java #sleep sleep 1 #睡1秒 echo woken #用expr执行整数运算 x=`expr 8 / 4` #"/"前后必须有空格;后引号则告诉系统: 将expr 执行的结果赋值给x echo "x=$x"
#调试shell.sh脚本,每执行一步前都打印一下这一步的指令 $/bin/sh -x ./shell.sh #若想只调试脚本里面一部分代码,需要在脚本文件里面插入调试指令 #打开调试 set -x if [ 1 -eq 1 ] ; then : else echo not true fi #关闭调试 set +x #不执行脚本,只进行语法检查 $/bin/sh -nv ./shell.sh
#结束程序,成功退出 exit 0 #失败退出,将约定的某个数字返回给shell exit 100 # 执行“./hello.sh; echo $?”,就可以看到100 #打印本脚本执行时的进程ID echo pid=$$ ######################## #子shell x=100 (#括号里的将在子shell里运行 echo $x #将打印100 y=900 ) echo $y #打印空
#函数 myName(){ echo "I’ve forgot your name" } myName #必须先定义函数,它能执行它 ########################### #函数可以接受参数,但参数不必声明 withArg(){ echo "the first arg is $1" } withArg "hello" ##########################3 #函数的返回值 withReturn(){ return 33 } withReturn echo $? #将打印33, "$?"就是上步函数调用得到的返回值
#!/bin/sh #if/else语句 i=1 if [ $i = 1 ] ; then #注意里面的分号 echo how elif [ $i = 2 ] ; then echo are else echo you fi #别忘了这个 #if/eles语句的单行写法,注意分号 if [ $i = 1 ]; then echo how; else echo are ; fi #bool值判断 ##用 "test xxx" if test "ab" = "ab"; then echo …
#!/bin/sh #如果在外面调用 hello.sh a b echo $0 #显示 hello.sh echo $1 #显示 a echo $2 #显示 b echo $# #显示 2,即2个参数 #用while + getopts处理所有选项 while getopts c:p OPTION ; do case "$OPTION" in c) echo "c is input" ;; p) echo "p is input" ;; \?) echo "Please specify -c or -p" ; exit 1 ;; esac …