Shell细小问题汇总

Shell细小问题汇总

本文原文出处: http://blog.csdn.net/bluishglc/article/details/44276607 严禁任何形式的转载,否则将委托CSDN官方维护权益!

  • Shell细小问题汇总

    • if 多条件组合判断示例
    • Linux系统时间设置
    • 在远程节点上推送命令时需要特别注意和
    • sudo -i和su -l的差异分析
    • 关于 varrun和pid
    • 文件测试参数汇总
    • 字符串测试参数汇总
    • 如何正确传递数组参数
    • 批量修改文件名
    • 配置163 yum repo的脚本
    • 关于devnull 21devnull
    • 标准输入输出和错误
    • 的字符串操作
    • 的字符串操作示例
    • 后台运行nohup
    • 条件测试test
    • 条件测试
    • 预定义的变量

if 多条件组合判断示例

if [ ! "$STARTUP_TARGET" = "all" -a ! "$STARTUP_TARGET" = "hadoop" -a ! "$STARTUP_TARGET" = "spark" ]
then
   echo "STARTUP_TARGET is invalid or not specified!"
   exit 1
fi

注意:对于if来说,后面紧跟的“[”实际上是test命令的别名!所以后续的表达式都是test命令的参数,所以才会需要:

  • “[“右侧要加一个空格再跟参数
  • “=”两侧都需要有空格

否则参数就连在了一起,变成了一个参数!


Linux系统时间设置

  1. 修改时区

    很多系统在安装时没有设置时区,这样很多系统默认就会使用统一协调时UTC来显示时间,使用date来查看一下输出时间就知道时区和时间是否正确了(如果是UTC表示是统一协调时,非本地时区,如果是CST表示中国标准时间,意味着时区已经正常)。通常,时间不正确多是只因为时区问题导致的,所以我们只需修改系统的时区就可以了,方法是把本地(中国上海)的时区文件覆盖到/etc/localtime即可:

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

2.修改ls -l的时间格式

vim /etc/profile.d/time_style.sh
add
export TIME_STYLE="+%F %T"

在远程节点上推送命令时需要特别注意$!和$?

ssh -T [email protected]<<EOF
    su -l hive -c "nohup $HIVE_HOME/bin/hive --service metastore -hiveconf hive.log.file=hive-metastore.log     -hiveconf hive.log.dir=$HIVE_LOG_DIR>$HIVE_LOG_DIR/hive-metastore.out 2>$HIVE_LOG_DIR/hive-metastore.log &"
    su -l hive -c "echo $!|cat>$HIVE_PID_DIR/hive-metastore.pid"
EOF

上述脚本中$!的值永远是当前主机或者说是本地shell下上一次后台程序的PID,而不可能是前一次推送的hive --service metastore的PID!


sudo -i和su -l的差异分析

ssh -T [email protected]$NAME_NODE<<EOF
sudo -i -u $HDFS_USER $HADOOP_HOME/bin/hdfs namenode -format -force
EOF
sudo: sorry, you must have a tty to run sudo

此错误需要通过visudo来修改相关配置,若改为:

ssh -T [email protected]$NAME_NODE<<EOF
su -l $HDFS_USER -c "$HADOOP_HOME/bin/hdfs namenode -format -force"
EOF

则没有问题,总结起来:su -l要比sudo -i方便好用!

补充:虽然使用 su很方便,不过缺点是,当我的主机是多人共管的环境时,如果大家都要使用 su 来切换成为 root 的身份,那么每个人都得要知道 root 的口令,这样口令太多人知道可能会流出去,很不妥当呢!怎办?透过 sudo 来处理即可!相对于 su 需要了解新切换的用户口令 (常常是需要 root 的口令), sudo 的运行则仅需要自己的口令即可! 甚至可以配置不需要口令即可运行 sudo 呢!


关于 /var/run和pid

Well since /var/run is mounted as tmpfs. That means it’s totally empty when your machine boots and it’s meant to be like this to prevent stuff like daemons not starting because of a left-over PID-file.

Startup scripts usually create the directories they need before using them. If you want to store a PID-file either put it in /var/run directly or create a directory before creating the PID-file. This is no place to store data that needs to remain there across reboots.

  1. /var/run是linux约定应用程序存放pid文件的地方(现在大多数系统已经改为了/run,然后把/var/run改为软连接指向了/run),这并非是一个特殊的文件夹,linux也不会强制应用程序把PID放在这里,只是说这是一个“约定的,默认的”存放PID文件的位置!这个文件夹唯一特殊的地方在于:在当前大多数的Linux系统下,它被挂载为了tmpfs分区,这意味:只要系统重启,文件夹内的所有数据都会清空
  2. 首先我们需要明白:PID文件本身和Linux操作系统没有必然关系,它的产生和使用都是应用程序自已来负责的!一般来说,规范的应用程序在启动时会到指定的文件夹下查找自己的PID文件,如果文件存在说明程序正在运行中,就终止当前的启动程序,并给出提示信息!如果不存在,才继续进行启动。当程序关闭时,也会自己删除PID文件!当然,以上说的是“规范”的应用程序,有的程序并不一定按照这样的规范操作,这就需要具体情况具体分析了。

文件测试参数汇总


字符串测试参数汇总


如何正确传递数组参数

#!/bin/sh
t()
{
    nodeList="$1"
    echo ${nodeList[*]}
}
a=(1 2 3)
t ${a[*]}

输出: 1

#!/bin/sh
t()
{
    nodeList="$1"
    echo ${nodeList[*]}
}
a=(1 2 3)
t "${a[*]}"

输出: 1 2 3


批量修改文件名

比如:将/etc/yum.repos.d下的CentOS的yum repo文件统一添加bak后缀:

for i in $(ls CentOS-*); do mv $i $i.bak;done

配置163 yum repo的脚本

cd /etc/yum.repos.d
for i in $(ls CentOS-*); do mv $i $i.bak;done
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo

关于”>/dev/null 2>&1”,”>&/dev/null”

id user >&/dev/null
if [$? != 0 ]
then
useradd -s /sbin/nologin $user
fi

上面是一段判断用户是否存在,如果不存在就添加用户的脚本,其中>&/dev/null 等同于 >/dev/null 2>&1 而>/dev/null 2>&1又等同于1>/dev/null 2>&1,它们的意思是一样的,即:将标准输出(也就是代表标准输出的文件1)重定向到/dev/null(即不打印标准输出信息),然后把标准错误输出(也就是代表标准错误输出的文件2)合并(也就是&符号的含义)重定向到标准输出,这样,最终达到的效果或者说是目地为:舍弃命令执行中输出的所有信息(不打印任何信息)!

在POSIX shell中,命令的结果可以通过%>的形式来定义(其中%表示文件描述符:1为标准输出stdout、2为标准错误stderr)!系统默认%值是1,也就是1>,而1>可以简写为>,也就是默认为>。

>&/dev/null这是对 >/dev/null 2>&1的一个缩写!


标准输入、输出和错误

当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆, shell同时也给出了相应的文件名。下面就是这些文件描述符及它们通常所对应的文件名:

文件 文件描述符
输入文件—标准输入 0
输出文件—标准输出 1
错误输出文件—标准错误 2

系统中实际上有12个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、

输出和错误。可以任意使用文件描述符3到9。


${}的字符串操作


${}的字符串操作示例

file=/dir1/dir2/dir3/my.file.txt

我们可以用${}分别替换获得不同的值:

${file#*/}:拿掉第一条/及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最后一条/及其左边的字符串:my.file.txt
${file#*.}:拿掉第一个.  及其左边的字符串:file.txt
${file##*.}:拿掉最后一个.  及其左边的字符串:txt
${file%/*}:拿掉最后条/及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:拿掉第一条/及其右边的字符串:(空值)
${file%.*}:拿掉最后一个.  及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一个.  及其右边的字符串:/dir1/dir2/dir3/my
${file:0:5}:提取最左边的5个字节:/dir1
${file:5:5}:提取第5个字节右边的连续5个字节:/dir2
${file/dir/path}:将第一个dir替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir替换为path:/path1/path2/path3/my.file.txt

记忆的方法为:

#是去掉左边(在鉴盘上#在$之左边)
%是去掉右边(在鉴盘上%在$之右边)
单一符号是最小匹配﹔两个符号是最大匹配

后台运行nohup…&

Unix/Linux下一般比如想让某个程序在后台运行,很多都是使用& 在程序结尾来让程序自动运行。比如我们要运行mysql在后台:

/usr/local/mysql/bin/mysqld_safe –user=mysql &

但是加入我们很多程序并不象mysqld一样做成守护进程,可能我们的程序只是普通程序而已,一般这种程序使用& 结尾,但是如果终端关闭,那么程序也会被关闭。但是为了能够后台运行,那么我们就可以使用nohup这个命令,比如我们有个test.php需要在后台运 行,并且希望在后台能够定期运行,那么就使用nohup:

nohup /root/test.php &


条件测试:test,[ ]

shell中的测试条件有三种:test,[ ]以及(( ))。其中test和[ ]是等价的,”[“实际上只是test命令的一个别名而已!这也是 [ 之后必须有空格的原因。因此将二者归为一类讨论。

[ ]

[ ]的测试对象有三种:

字符串 ,如[ -z str ]

数字,如[ n1 -lt n2 ]

文件,如[ -f filename ]

[ ]内的变量,最好用双引号包括; 中括号内的常量,最好用单引号或双引号包括,例如

if [ -z ${var} ]  #可能出错
if [ -z "${var}" ]  #最好改成这样  

-a(与)和-o(或):进行多重条件的复合测试,如

if [ -n "${var}" -a "${var}" -lt 100 ] #当变量被定义且其值小于100时

取反测试!:对测试条件取反

if [ ! "$?" -eq "0" ]  #上一条命令返回值不等于0  

条件测试:(( ))

1.(( ))作测试条件用时其中可使用类C的数字测试条件,包括

< :小于
> :大于
<= :小于等于
>= :大于等于
== :等于
!= :不等于

2.经测试,(( ))中不能用-a,-o以及!等复合测试

3.(( ))除用作数值测试之外,还可用于变量自增减,如(( var++ ))


预定义的变量

时间: 2024-10-15 19:46:15

Shell细小问题汇总的相关文章

2016- Shell细小问题汇总

Shell细小问题汇总 目录(?)[+] Shell细小问题汇总 Shell细小问题汇总 使用find查找文件 grep查找文件内容 if 多条件组合判断示例 Linux系统时间设置 在远程节点上推送命令时需要特别注意和 sudo -i和su -l的差异分析 关于 varrun和pid 文件测试参数汇总 字符串测试参数汇总 如何正确传递数组参数 批量修改文件名 配置163 yum repo的脚本 关于devnull 21devnull 标准输入输出和错误 变量的字符串操作 变量的字符串操作示例

Shell脚本使用汇总整理——mysql数据库5.7.8以前备份脚本

Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/9223477.html 脚本分为三部分配置信息.脚本文件.定时任务: 1.配置信息: username=rootpassword=123456backupsFileStr=/wocloud/db/backupsbackupsFileDay=3mysqldumpStr=/usr/bin/mysqldumpcopydb=hebei,reportSystem 参数说明: usern

我所遇到的shell小知识点汇总

1)shell if 的使用 判断a.txt是否存在 if [ -f a.txt] 2)命令的执行结果 将命令的执行结果赋值给变量,以下两种方法是一样的 time=$(date + %Y%m) time=`date + $Y%m` 3)查找出我们需要的东西 这个可以用来判断命令的执行结果,通过所选取的文件或命令执行结果中是否有相应的值 -o表示匹配的就只是我们关心的部分,加-P表明后面的pattern是perl兼容正则表达式,因为pcre支持零宽断言 [[email protected] by-

shell常用命令汇总

现在基于linux开发横行,互联网产品后台基本都是基于linux,android,mac,到处都是linux,所以,作为一个与时俱进的测试,不熟悉linux是不行的,记录一下测试中常用的一些shell命令. 1.ls:打印出当前目录的清单 ls –a:Linux上的文件以.开头的文件被系统视为隐藏文件,仅用ls命令是看不到他们的,而用ls -a除了显示一般文件名外,连隐藏文件也会显示出来 ls –l:该参数显示更详细的文件信息. 2.cd:切换当前目录 cd /:回到根目录 cd ..:返回上一

Shell脚本使用汇总整理

一.Shell脚本常用的头部格式: 头部的作用就是告知linux此脚本的类型: 常用的头部格式如下:(/bin/bash,是bash的路径,如果不知道路径可以通过which bash进行查看,其它命令的路径也是类似查看的) (1)#!/bin/bash:普通的linux脚本,也是最常用的,不需要交互: (2)#!/usr/bin/expect:可以自动交互的linux脚本,有可能需要安装expect,如果linux服务器上没有此expect命令的话. 二.Shell脚本中如何执行Linux或自定

Shell脚本命令汇总中

一.换行 echo -e 可以通过\n编译换行 echo -n不换行,如果加入了\n,则会打出“\n”字符 #!/bin/bash echo -e "O\nK\n!" echo "It is a test" #!/bin/bash echo -n "OK!" echo "It is a test" #!/bin/bash echo -n "O\nK\n!" echo "It is a test&q

shell 小问题汇总

今天写脚本碰到一个奇怪的事情 变量a为定义 if [ -a $a ];then echo "exists"; else echo "not exists";fi 结果输出: exists 瞬间瞎了, 不过改成这样就可以了 if [ -a "$a" ] 当然这里的a是脚本输入的参数, 有的时候可能没有输入参数, 所以可能出现没有定义的事情发生 另外, ((exp, ..)), exp可以是c语言语句, 变量不用$, 但是只能是整数,浮点数都不行 小

latex: 使用中的小问题汇总 updating...

latex is fucking good. 当使用latex写文档后,发现它真的是太强大了,包含的内容如此之多,如此之广,可谓All in one, one is enough! 当然在使用它的时候会有很多很多细节无法记住,那么现将遇到的细小问题汇总于此,说明如下: 主要用于汇总latex使用过程中遇到的各种小问题,方便以后查阅: 涉及标签,命令等相关用法: 所有小问题如下: 1. Tikz绘图时,使node labels的位置位于node之下,而非node之中. 参考:Tikz node l

shell脚本汇总 2 删除创建时间超过32天的文件

shell脚本汇总 2 删除创建时间超过32天的文件 #!/bin/bash #date:2017-04-11 #version:clear_ballcloud_back_v1.0 #contents: removing the  /www/web/ballcloud_bakck/* , if the file is created above 32 day # cd /www/web #sum the size of already delete directory dirsize=`du -