有无人懂得shell的编程啊?
什么是SHELLSHELL为我们在用户和linux系统之间提供了一个交互界面。它读取我们的输入然后执行特定的程序。当程序执行的时候它还显示命令输出。因此SHELL被称作linux系统的命令解析器。shell的作用就是遵循一定的语法将输入的命令加以解释并传给系统。它是用户使用linux的桥梁。
登录Linux 系统时,将会看到像这样的提示符:#或$
您所看到的特殊的提示符可能看起来很不一样。它可能包含系统的主机名、当前的工作目录名,或者两者都有。但是不管这个特殊的提示符看起来像什么,有一件事是肯定的。打印出这个提示符的程序叫“shell”,极有可能您的特殊的shell 是一个叫bash 的程序。
几种流行的SHELL
ash、bash、ksh、csh、zsh
[root@localhost~ ]#echo $SHELL显示系统当前使用的SHELL
[root@localhost~ ]#chsh-l列出系统所支持的shellBash 是“Bourne-again shell”的首字母缩写,它是大多数Linux 系统缺省的shell。shell 的任务是执行您的命令,使您能够与Linux 系统进行交互。当您输完命令,您可以通知shell 执行exit 或logout 命令,在此您将返回到登录提示符。
[root@localhost~ ]#csh直接进入csh中,这个shell被称为子shell
[root@localhost~ ]# exit退出这个shell Shell特殊字符
Shell变量的名称中只能包含字母(a到z、A到Z),数字(0到9)和下划线(_)。此外变量名只能以字母或下划线开始。
Shell中引号分为三种:单引号,双引号和反引号
特殊字符用单引号括起来以后,会失去原来的意义,而只作为普通字符解释。
例:[root@localhost~ ]# echo ‘$binnary’
Shell特殊字符
Shell特殊字符:
由双引号括起来的字符,除$、\、`、“这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。
$字符:就是用其后指定的变量的值来代替这个变量和$
例:
[root@localhost~ ]# echo $PATH
\符号:是转义字符,它告诉shell不要对其后面的那个字符进行特殊处理,只当作普通字符。
例:
[root@localhost~ ]# echo it’s good
[root@localhost~ ]# echo it\’s good
`符号:叫做反引号,反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号。
[root@localhost~ ]# echo `date` 输入/输出重定向和管道
[root@localhost~ ]# ls*.doc >> d.doc
和程序的标准输出重定向一样,程序的错误输出也可以重新定向。使用符号2>(或追加符号2>>)表示对错误输出设备重定向。
[root@localhost~ ]# ls/usr/tmp2> err.file
还可以使用另一个输出重定向操作符(&>)将标准输出和错误输出同时送到同一文件中。
例:
[root@localhost~ ]# ls/usr/tmp&> output.file 命令执行顺序
命令间隔符说明
;
用;间隔的各命令按顺序依次执行。
&&
前后命令的执行存在“逻辑与”关系,只有&&前面的命令执行成功后,它后面的命令才被执行。
||
前后命令的执行存在“逻辑或”关系,只有||前面的命令执行失败后,它后面的命令才被执行。 Shell的执行方式
Shell的执行方式可以选择使用下面三种方法:
1、改文件的权限。
[root@localhost~ ]#chmod755 filename.sh
[root@localhost~ ]#./filename.sh
2、直接使用:sh命令
[root@localhost~ ]# shfilename.sh
3、使用bash命令
[root@localhost~ ]# bash filename.sh
Linux shell常用命令
Linux shell常用命令汇总
对于经常使用linux系统的博主来说,基本常用的shell命令是少不了的,下面为大家总结了Linux shell的常用命令,希望对大家有所帮助!
1.检查远程端口是否对bash开放:
echo >/dev/tcp/8.8.8.8/53 && echo "open"
2.让进程转入后台:
Ctrl + z
3、将进程转到前台:
fg
4.产生随机的十六进制数,其中n是字符数:
openssl rand -hex n
5.在当前shell里执行一个文件里的命令:
source /home/user/file.name
6.截取前5个字符:
${variable:0:5}
7.SSH debug 模式:
ssh -vvv user@ip_address
8.SSH with pem key:
ssh user@ip_address -i key.pem
9.用wget抓取完整的网站目录结构,存放到本地目录中:
wget -r --no-parent --reject "index.html*" http://hostname/ -P /home/user/dirs
10.一次创建多个目录:
mkdir -p /home/user/{test,test1,test2}
11.列出包括子进程的进程树:
ps axwef
12.创建 war 文件:
jar -cvf name.war file
13.测试硬盘写入速度:
dd if=/dev/zero of=/tmp/output.img bs=8k count=256k; rm -rf /tmp/output.img
14.测试硬盘读取速度:
hdparm -Tt /dev/sda
15.获取文本的md5 hash:
echo -n "text" | md5sum
16.检查xml格式:
xmllint --noout file.xml
17.将tar.gz提取到新目录里:
tar zxvf package.tar.gz -C new_dir
18.使用curl获取HTTP头信息:
curl -I http://www.example.com
19.修改文件或目录的时间戳(YYMMDDhhmm):
touch -t 0712250000 file
20.用wget命令执行ftp下载:
wget -m ftp://username:password@hostname
21.生成随机密码(例子里是16个字符长):
LANG=c < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-16};echo;
22.快速备份一个文件:
cp some_file_name{,.bkp}
23.访问Windows共享目录:
smbclient -U "DOMAIN\user" //dc.domain.com/share/test/dir
24.执行历史记录里的命令(这里是第100行):
!100
25.解压:
unzip package_name.zip -d dir_name
26.输入多行文字(CTRL + d 退出):
cat > test.txt
27.创建空文件或清空一个现有文件:
\> test.txt
28.与Ubuntu NTP server同步时间:
ntpdate ntp.ubuntu.com
29.用netstat显示所有tcp4监听端口:
netstat -lnt4 | awk '{print $4}' | cut -f2 -d: | grep -o '[0-9]*'
30.qcow2镜像文件转换:
qemu-img convert -f qcow2 -O raw precise-server-cloudimg-amd64-disk1.img \precise-server-cloudimg-amd64-disk1.raw
31.重复运行文件,显示其输出(缺省是2秒一次):
watch ps -ef
32.所有用户列表:
getent passwd
33.Mount root in read/write mode:
mount -o remount,rw /
34.挂载一个目录(这是不能使用链接的情况):
mount --bind /source /destination
35.动态更新DNS server:
nsupdate
update add $HOST 86400 A $IP
send
EOF
36.递归grep所有目录:
grep -r "some_text" /path/to/dir
37.列出前10个最大的文件:
lsof / | awk '{ if($7 > 1048576) print $7/1048576 "MB "$9 }' | sort -n -u | tail
39.打开Vim并跳到文件末:
vim + some_file_name
40.Git 克隆指定分支(master):
git clone [email protected]:name/app.git -b master
41.Git 切换到其它分支(develop):
git checkout develop
42.Git 删除分支(myfeature):
git branch -d myfeature
43.Git 删除远程分支
git push origin :branchName
44.Git 将新分支推送到远程服务器:
git push -u origin mynewfeature
45.打印历史记录中最后一次cat命令:
!cat:p
46.运行历史记录里最后一次cat命令:
!cat
47.找出/home/user下所有空子目录:
echo >/dev/tcp/8.8.8.8/53 && echo "open"
1.检查远程端口是否对bash开放:
find /home/user -maxdepth 1 -type d -empty
48.获取test.txt文件中第50-60行内容:
< test.txt sed -n '50,60p'
49.运行最后一个命令(如果最后一个命令是mkdir /root/test, 下面将会运行: sudo mkdir /root/test):
sudo !!
50.创建临时RAM文件系统 – ramdisk (先创建/tmpram目录):
mount -t tmpfs tmpfs /tmpram -o size=512m
51.Grep whole words:
grep -w "name" test.txt
52.在需要提升权限的.情况下往一个文件里追加文本:
echo "some text" | sudo tee -a /path/file
53.列出所有kill signal参数:
kill -l
54.在bash历史记录里禁止记录最后一次会话:
kill -9 $$
55.扫描网络寻找开放的端口:
nmap -p 8081 172.20.0.0/16
56.设置git email:
git config --global user.email "[email protected]"
57.To sync with master if you have unpublished commits:
git pull --rebase origin master
58.将所有文件名中含有”txt”的文件移入/home/user目录:
find -iname "*txt*" -exec mv -v {} /home/user \;
59.将文件按行并列显示:
paste test.txt test1.txt
60.shell里的进度条:
pv data.log
61.使用netcat将数据发送到Graphite server:
echo "hosts.sampleHost 10 `date +%s`" | nc 192.168.200.2 3000
62.将tabs转换成空格:
expand test.txt > test1.txt
63.Skip bash history:
cmd
64.去之前的工作目录:
cd -
65.拆分大体积的tar.gz文件(每个100MB),然后合并回去:
split –b 100m /path/to/large/archive /path/to/output/files
cat files* > archive
66.使用curl获取HTTP status code:
curl -sL -w "%{http_code}\\n" www.example.com -o /dev/null
67.设置root密码,强化MySQL安全安装:
/usr/bin/mysql_secure_installation
68.当Ctrl + c不好使时:
Ctrl + \
69.获取文件owner:
stat -c %U file.txt
70.block设备列表:
lsblk -f
71.找出文件名结尾有空格的文件:
find . -type f -exec egrep -l " +$" {} \;
72.找出文件名有tab缩进符的文件
find . -type f -exec egrep -l $'\t' {} \;
73.用”=”打印出横线:全选复制放进笔记
printf '%100s\n' | tr ' ' = ;
关于Linux下的shell
连接上主机的一套输入输出设备就叫终端。比如显示器和键盘。
以前,如果想同时用两个用户登陆,你得备两套终端吧。。
现在的类UNIX系统都提供了“终端模拟器”程序,开一个窗口相当于连上一台终端。
shell字面是外壳程序。处于操作系统内核和应用程序之间。是用户和系统交互的界面。也理解成命令解释器。
区别如上。
不同的shell有不同的特性。
比如csh,不支持定义函数,但是语法和c语言很像,比较适合执行简单的单命令任务。bash是linux的标配,就支持函数了。各种shell在功能的丰富程度上各不相同,选择自己需要的来用了。
经典的UNIX的root的默认shell是sh,功能很少,当然也强迫你操作时必需仔细小心,linux把sh链到了bash了。ksh也是以前用得很多的,好多既存的脚本也是用ksh写的。
功能最强的可能是zsh了吧,我是没有用过,楼主有兴趣研究研究。:)
求一个Linux的shell脚本或者程序
1.1 什么是shell?Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户。这种对话方式可以是交互式也可以是非交互式的 我们所输入的命令计算机是不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们。 当前终端使用的哪种shell? 大多数linux发行版本默认shell使用的是bash 1.2 扩展:编程语言分类编程语言主要用:低级语言和高级语言1)低级语言:机器语言:二进制语言汇编语言:符号语言,使用助记符来代替操作码,也就是用符号代替机器语言的二进制码 它们都是面向机器的语言 2)高级语言:它是比较接近自然语言或者说人类语言的一种编程,用人们能够容易理解的方式进行编写程序,静态语言:编译型语言 如:c 、 c++ 、 java,动态语言:解释型语言 如: php 、 shell 、 python 、 perlgcc编译器:(解释器) 将人类理解的语言翻译成机器理解的语言静态语言和动态语言的区别:静态语言编译时,变量的数据类型是确定的,静态语言对硬件更友好,运行效率更高。动态语言,运行时确定变量的数据类型,且运行时可改变变量的类型。动态语言更简洁,对人类更友好,可以把更多精力放在业务逻辑上。
Linux里面基本的shell脚本编写有哪些?
shell脚本就是一些命令的集合。
举个例子,我想实现这样的操作:
1)进入到/tmp/目录;
2)列出当前目录中所有的文件名;
3)把所有当前的文件拷贝到/root/目录下;
4)删除当前目录下所有的文件。
简单的4步在shell窗口中需要你敲4次命令,按4次回车。这样是不是很麻烦?当然这4步操作非常简单,如果是更加复杂的命令设置需要几十次操作呢?那样的话一次一次敲键盘会很麻烦。所以不妨把所有的操作都记录到一个文档中,然后去调用文档中的命令,这样一步操作就可以完成。其实这个文档呢就是shell脚本了,只是这个shell脚本有它特殊的格式。《linux 就该这么学》
Shell脚本通常都是以.sh 为后缀名的,这个并不是说不带.sh这个脚本就不能执行,只是大家的一个习惯而已。所以,以后你发现了.sh为后缀的文件那么它一定会是一个shell脚本了。test.sh中第一行一定是 “#! /bin/bash” 它代表的意思是,该文件使用的是bash语法。如果不设置该行,那么你的shell脚本就不能被执行。’#’表示注释,在前面讲过的。后面跟一些该脚本的相关注释内容以及作者和创建日期或者版本等等。当然这些注释并非必须的,如果你懒的很,可以省略掉,但是笔者不建议省略。因为随着你工作时间的增加,你写的shell脚本也会越来越多,如果有一天你回头查看你写的某个脚本时,很有可能忘记该脚本是用来干什么的以及什么时候写的。所以写上注释是有必要的。另外系统管理员并非你一个,如果是其他管理员查看你的脚本,他看不懂岂不是很郁闷。该脚本再往下面则为要运行的命令了。
Linux Shell 脚本编程最佳实践
IT路边社 前言 与其它的编码规范一样,这里所讨论的不仅仅是编码格式美不美观的问题, 同时也讨论一些约定及编码标准。这份文档主要侧重于我们所普遍遵循的规则,对于那些不是明确强制要求的,我们尽量避免提供意见。 编码规范对于程序员而言尤为重要,有以下几个原因: 本文档中的准则致力于最大限度达到以下原则: 尽管本文档涵盖了许多基础知识,但应注意的是,没有编码规范可以为我们回答所有问题,开发人员始终需要再编写完代码后,对上述原则做出正确的判断。 注 :未明确指明的则默认为必须(Mandatory) 主要参考如下文档: 仅建议Shell用作相对简单的实用工具或者包装脚本。因此单个shell脚本内容不宜太过复杂。 在选择何时使用shell脚本时时应遵循以下原则: 可执行文件不建议有扩展名,库文件必须使用 .sh 作为扩展名,且应是不可执行的。 执行一个程序时,无需知道其编写语言,且shell脚本并不要求具有扩展名,所以更倾向可执行文件没有扩展名。 而库文件知道其编写语言十分重要,使用 .sh 作为特定语言后缀的扩展名,可以和其他语言编写的库文件加以区分。 文件名要求全部小写, 可以包含下划线 _ 或连字符 - , 建议可执行文件使用连字符,库文件使用下划线。 正例: 反例: 源文件编码格式为UTF-8。避免不同操作系统对文件换行处理的方式不同,一律使用 LF 。 每行最多不超过120个字符。每行代码最大长度限制的根本原因是过长的行会导致阅读障碍,使得缩进失效。 除了以下两种情况例外: 如出现长度必须超过120个字符的字符串,应尽量使用here document或者嵌入的换行符等合适的方法使其变短。 示例: 除了在行结束使用换行符,空格是源文件中唯一允许出现的空白字符。 对从来没有用到的或者被注释的方法、变量等要坚决从代码中清理出去,避免过多垃圾造成干扰。 Bash 是唯一被允许使用的可执行脚本shell。 可执行文件必须以 #!/bin/bash 开始。请使用 set 来设置shell的选项,使得用 bash echo "Process $: Done making $$$." # 示例7:命令参数及路径不需要引号 grep -li Hugo /dev/ "$1" # 示例8:常规变量用双引号,ccs可能为空的特殊情况可不用引号 git send-email --to "${reviewers}" ${ccs:+"--cc" "${ccs}"} # 示例9:正则用单引号,$1可能为空的特殊情况可不用引号 grep -cP '([Ss]pecial||?characters*) ${1:+"$1"} # 示例10:位置参数传递推荐带引号的"$@",所有参数作为单字符串传递用带引号的"$*" # content of t.sh func_t { echo num: $# echo args: 1:$1 2:$2 3:$3 } func_t "$@" func_t "$*" # 当执行 ./t.sh a b c 时输出如下: num: 3 args: 1:a 2:b 3:c num: 1 args: 1:a b c 2: 3: 使用 $(command) 而不是反引号。 因反引号如果要嵌套则要求用反斜杠转义内部的反引号。而 $(command) 形式的嵌套无需转义,且可读性更高。 正例: 反例: 条件测试 使用 [[ ... ]] ,而不是 [ , test , 和 /usr/bin/[ 。 因为在 [[ 和 ]] 之间不会出现路径扩展或单词切分,所以使用 [[ ... ]] 能够减少犯错。且 [[ ... ]] 支持正则表达式匹配,而 [ ... ] 不支持。参考以下示例: 尽可能使用变量引用,而非字符串过滤。 Bash可以很好的处理空字符串测试,请使用空/非空字符串测试方法,而不是过滤字符,让代码具有更高的可读性。正例: 反例: 正例: 反例: 正例: 反例: 文件名扩展 当进行文件名的通配符扩展时,请指定明确的路径。 当目录中有特殊文件名如以 - 开头的文件时,使用带路径的扩展通配符 ./* 比不带路径的 * 要安全很多。 应该避免使用eval。 Eval在用于分配变量时会修改输入内容,但设置变量的同时并不能检查这些变量是什么。反例: 请使用进程替换或者for循环,而不是通过管道连接while循环。 这是因为在管道之后的while循环中,命令是在一个子shell中运行的,因此对变量的修改是不能传递给父shell的。 这种管道连接while循环中的隐式子shell使得bug定位非常困难。反例: 如果你确定输入中不包含空格或者其他特殊符号(通常不是来自用户输入),则可以用for循环代替。例如: 使用进程替换可实现重定向输出,但是请将命令放入显式子 shell,而非 while 循环创建的隐式子 shell。例如: 总是检查返回值,且提供有用的返回值。 对于非管道命令,使用 $? 或直接通过 if 语句来检查以保持其简洁。 例如: 当内建命令可以完成相同的任务时,在shell内建命令和调用外部命令之间,应尽量选择内建命令。 因内建命令相比外部命令而言会产生更少的依赖,且多数情况调用内建命令比调用外部命令可以获得更好的性能(通常外部命令会产生额外的进程开销)。 正例: 反例: 加载外部库文件不建议用使用.,建议使用source,已提升可阅读性。正例: 反例: 除非必要情况,尽量使用单个命令及其参数组合来完成一项任务,而非多个命令加上管道的不必要组合。常见的不建议的用法例如:cat和grep连用过滤字符串; cat和wc连用统计行数; grep和wc连用统计行数等。 正例: 除特殊情况外,几乎所有函数都不应该使用exit直接退出脚本,而应该使用return进行返回,以便后续逻辑中可以对错误进行处理。正例: 反例: 推荐以下工具帮助我们进行代码的规范: 原文链接:http://itxx00.github.io/blog/2020/01/03/shell-standards/ 获取更多的面试题、脚本等运维资料点击: 运维知识社区 获取 脚本之---短信轰炸机 脚本之---QQ微信轰炸机 ansible---一键搭建redis5.0.5集群 elk7.9真集群docker部署文档 全球最全loki部署及配置文档 最强安全加固脚本2.0 一键设置iptbales脚本