Linux export
shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该次登陆操作。
当我们退出登录或者关闭终端再重新打开时,这个环境变量就会消失。是临时的。
如果要添加对所有用户生效的永久性变量(系统级)
修改/etc/profile
对单一用户生效的永久性变量(用户级)
修改~/.bash_profile
语法
export [-fnp][变量名称]=[变量设置值]
参数说明:
-f 代表[变量名称]中为函数名称。
-n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
-p 列出所有的shell赋予程序的环境变量。
export F=a //增加F环境变量
export F=b //增加F环境变量为b
$F //获取环境变量F
at 定时任务
在一个指定的时间执行一个指定任务,只能执行一次。首先在终端运行at命令,将计划时间作为选项传递给它。然后它提示您输入要在计划时间运行的命令(或一系列命令)。完成后按Control-D,您的命令将被放入队列中。
at 9:30 PM Tue
at> echo "Well gosh golly, it's 9:30 PM on Sunday."
at> ^D
job 1 at Sun Nov 16 09:30:00 2014
echo "ls -l >> t.log " | at 07:00
参考:https://stackoverflow.com/questions/18945669/how-to-run-a-script-at-a-certain-time-on-linux
It then places us at the at> prompt. Here we type in a simple echo command, which echoes a string of text. We press enter, and we're placed at a new at> prompt. We then press Control-D, telling at we're all done with our commands. It then tells us that our job is job number 1 and that it will run next Tuesday.
up.sh改变s.sh (当前bash脚本)的变量无效
at -f ./up.sh now + 1 minutes
up.sh从s.sh (当前bash脚本)会立即执行
at -f . ./up.sh now + 1 minutes
命令参数:
-m 当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出
-I atq的别名
-d atrm的别名
-v 显示任务将被执行的时间
-c 打印任务的内容到标准输出
-V 显示版本信息
-q<列队> 使用指定的列队
-f<文件> 从指定文件读入任务而不是从标准输入读入
-t<时间参数> 以时间参数的形式提交要运行的任务
参考:https://www.computerhope.com/unix/uat.htm
https://blog.csdn.net/gxiaop/article/details/55101020
here document
Here Document 是在Linux Shell 中的一种特殊的重定向方式,它的基本的形式如下
cmd << delimiter
Here Document Content
delimiter
它的作用就是将两个 delimiter 之间的内容(Here Document Content 部分) 传递给cmd 作为输入参数。
比如在终端中输入cat << EOF ,系统会提示继续进行输入,输入多行信息再输入EOF,中间输入的信息将会显示在屏幕上。如下:
fish@mangos:~$ cat << EOF
> First Line
> Second Line
> Third Line EOF
> EOF
First Line
Second Line
Third Line EOF
注: >这个符号是终端产生的提示输入信息的标识符
这里要注意几点
EOF 只是一个标识而已,可以替换成任意的合法字符
作为结尾的delimiter一定要顶格写,前面不能有任何字符
作为结尾的delimiter后面也不能有任何的字符(包括空格)
作为起始的delimiter前后的空格会被省略掉
Here Document 不仅可以在终端上使用,在shell 文件中也可以使用,例如下面的here.sh 文件
cat << EOF > output.sh
echo "hello"
echo "world"
EOF
使用 sh here.sh 运行这个脚本文件,会得到output.sh 这个新文件,里面的内容如下
echo "hello"
echo "world"
参考:https://blog.csdn.net/shixiaoguo90/article/details/49781971
https://www.tldp.org/LDP/abs/html/here-docs.html
here string
here string可以看成是here document的一种定制形式. 除了COMMAND <<<WORD, 就什么都没有了,WORD将被扩展并且被送入COMMAND的stdin中.
As a simple example, consider this alternative to the echo-grep construction.
if echo "$VAR" | grep -q txt # if [[ $VAR = *txt* ]]
# etc.
# Try:
if grep -q "txt" <<< "$VAR"
then # ^^^
echo "$VAR contains the substring sequence \"txt\""
fi
Or, in combination with read:
read -r -a Words <<< "$String"
# The -a option to "read"
#+ assigns the resulting values to successive members of an array.
echo "First word in String is: ${Words[0]}" # This
echo "Second word in String is: ${Words[1]}" # is
echo "Third word in String is: ${Words[2]}" # a
echo "Fourth word in String is: ${Words[3]}" # string
echo "Fifth word in String is: ${Words[4]}" # of
echo "Sixth word in String is: ${Words[5]}" # words.
echo "Seventh word in String is: ${Words[6]}" # (null)
# Past end of $String.
参考:https://www.tldp.org/LDP/abs/html/x17837.html
linux 创建文件
vi
vi 1.txt 会直接创建并打开一个文件1.txt
touch
touch的作用是更改一个文件或目录的时间。touch 2.txt 如果2.txt不存在,则创建空文件2.txt
echo
echo “abcd” > 3.txt 可以直接创建文件3.txt并将abcd写入。
参考:https://blog.csdn.net/xyw_blog/article/details/16861263
linux 查看文件内容的命令
cat 由第一行开始显示档案内容
tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
more 一页一页的显示档案内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只看头几行
tail 只看尾巴几行
tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。
nl 显示的时候,顺道输出 行号!
od 以二进制的方式读取档案内容!
把cat file 当做变量,varFile的命名如果为f.var,就什么都不会打印出来。f.var改成f.txt就可以。可能是后缀名称不支持。 echo "inside(cat $varFile)"
rmdir删除空目录
- Linux mv命令用来为文件或目录改名、或将文件或目录移入其它位置。
mv 文件名 文件名 将源文件名改为目标文件名
mv 文件名 目录名 将文件移动到目标目录
mv 目录名 目录名 目标目录已存在,将源目录移动到目标目录;目标目录不存在则改名
mv 目录名 文件名 出错
将文件 aaa 更名为 bbb :
mv aaa bbb
将info目录放入logs目录中。注意,如果logs目录不存在,则该命令将info改名为logs。
mv info/ logs
rm命令用于删除一个文件或者目录
rm [options] name...
参数:
-i 删除前逐一询问确认。
-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
-r 将目录及以下之档案亦逐一删除。
清空文件夹
rm -rf /path/to/directory/*
删除文件的内容
filename
cat /dev/null > filename
cp /dev/null filename
3.mkdir命令用于建立名称为 dirName 之子目录。
mkdir [-p] dirName
在工作目录下的 BBB 目录中,建立一个名为 Test 的子目录。 若 BBB 目录原本不存在,则建立一个。(注:本例若不加 -p,且原本 BBB目录不存在,则产生错误。)
mkdir -p BBB/Test
vi删除多行
dd 删除一行
d删除以当前字符开始的一行字符 ndd 删除以当前行开始的n行 dw 删除以当前字符开始的一个字 ndw 删除以当前字符开始的n个字 D 与d同义
d) 删除到下一句的开始
d} 删除到下一段的开始
d回车 删除2行
ps
Linux ps命令用于显示当前进程 (process) 的状态。
ps -A 显示进程信息
ps -u root //显示root进程用户信息
ps -ef //显示所有命令,连带命令行
ps -x 显示没有控制终端的进程,同时显示各个命令的具体路径。(守护进程)
pgrep命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程id。
pgrep inotify
查看守护进程
ps -eo 'tty,pid,comm' | grep ^?
参考:https://unix.stackexchange.com/questions/175380/how-to-list-all-running-daemons
kill
Linux kill命令用于删除执行中的程序或工作。
杀死进程
kill 12345
强制杀死进程
kill -KILL 123456
彻底杀死进程
kill -9 123456
改进pkill和killall:
看到pkill想到了什么?没错pgrep和kill!pkill=pgrep+kill。
pkill -9 firefox
killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。pkill或者pgrep只要给出进程名的一部分就可以终止进程。
killall -9 firefox
守护进程
图下所示为使用ps命令查看Linux系统进程的情况。从图中可以看到守护进程的一些特点:所有的守护进程都是以超级用户启动的(UID为0);没有控制终端(TTY为?);终端进程组ID为-1(TPGID表示终端进程组ID,该值表示与控制终端相关的前台进程组,如果未和任何终端相关,其值为−1)。
所有的守护进程的父进程都为init进程(PID为1的进程),如图8.2所示。可以使用pstree命令列出Linux系统中进程树的结构来进行验证。
参考:https://blog.csdn.net/u012317833/article/details/39342389
4.rsync
参考:https://wiki.archlinux.org/index.php/Rsync_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
http://man.linuxde.net/rsync
http://roclinux.cn/?p=2643
参数:
--v 详细模式输出。
-q, --quiet 精简输出模式。
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
-r, --recursive 对子目录以递归模式处理。
-R, --relative 使用相对路径信息。
-l, --links 保留软链结。
-L, --copy-links 想对待常规文件一样处理软链结。
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结。
--safe-links 忽略指向SRC路径目录树以外的链结。
-H, --hard-links 保留硬链结。
-p, --perms 保持文件权限。
-o, --owner 保持文件属主信息。
-g, --group 保持文件属组信息。
-D, --devices 保持设备文件信息。
-t, --times 保持文件时间信息。
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件。
--delete 删除那些DST中SRC没有的文件。
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输。
--force 强制删除目录,即使不为空。
--timeout=time ip超时时间,单位为秒。
-I, --ignore-times 不跳过那些有同样的时间和长度的文件。
-P 等同于 --partial。
--progress 显示备份过程。
-z, --compress 对备份的文件在传输时进行压缩处理。
--exclude=PATTERN 指定排除不需要传输的文件模式。
--include=PATTERN 指定不排除而需要传输的文件模式。
--exclude-from=FILE 排除FILE中指定模式的文件。
--include-from=FILE 不排除FILE指定模式匹配的文件。
--version 打印版本信息。
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件。
--port=PORT 指定其他的rsync服务端口。
--blocking-io 对远程shell使用阻塞IO。
-stats 给出某些文件的传输状态。
--progress 在传输时现实传输过程。
--log-format=formAT 指定日志文件格式。
--password-file=FILE 从FILE中得到密码。
--bwlimit=KBPS 限制I/O带宽,KBytes per second。
-h, --help 显示帮助信息。</pre>
rsync 可以作为 cp 命令的高级替代品,特别在复制较大的文件的场景中:
rsync -P source destination 其中 -P 与 --partial --progress 选项的作用是相同的,该选项使得文件可以分块传输并显示传输过程中的进度。 您可能需要使用 -r --recursive 选项使目录被递归地传输。 通过 cp 命令,可以本地复制文件,但 rsync 令人激动的一个特性是可以远程复制文件,例如,在两个不同的主机之间。远程位置可以用主机加冒号进行指定: rsync source host:destination
或者
$ rsync host:source destination
网络文件传输默认使用SSH协议。
注意尾随下划
Arch 默认使用 GNU cp (part of GNU coreutils). 然而,rsync 遵循 BSD cp 的约定, 源目录后面带有一个斜杠“/”有着特定的处理。比如:
$ rsync -r source destination
创建一个有着 "source"内容的 "destination/source"目录,命令:
rsync -r source/ destination 把"source/"目录下的所有文件全部复制到"destination"目录下,而没有中间的子目录 - 就像你调用了: rsync -r source/. destination
vi操作
u 撤销上一步的操作
Ctrl+r 恢复上一步被撤销的操作
Vim快速移动光标至行首和行尾
需要按行快速移动光标时,可以使用键盘上的编辑键Home,快速将光标移动至当前行的行首。除此之外,也可以在命令模式中使用快捷键"^"(即Shift+6)或0(数字0)。
如果要快速移动光标至当前行的行尾,可以使用编辑键End。也可以在命令模式中使用快捷键""(Shift+4)。 与快捷键"^"和0不同,快捷键""前可以加上数字表示移动的行数。例如使用"1"表示当前行的行尾,"2"表示当前行的下一行的行尾。
vim一个文件,如果不正常退出,再次编辑时是会提示一些信息的,并且有一个隐藏的文件.xxx.swp
swp先产生,如果swp存在就产生第二个swx。
参考:https://www.codetd.com/article/1020806
Shell 注释
以"#"开头的行就是注释,会被解释器忽略。
sh里没有多行注释,只能每一行加一个#号。只能像这样:
多行注释
多行注释还可以使用以下格式:
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
EOF 也可以使用其他符号:
:<<'
注释内容...
注释内容...
注释内容...
'
:<<!
注释内容...
注释内容...
注释内容...
!
linux系统目录:
/bin:
bin是Binary的缩写, 这个目录存放着最经常使用的命令。比如/bin/sh
/dev :
dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备。比如/dev/null 表示不存在的设备
/home:
用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
/opt:
这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。
/root:
该目录为系统管理员,也称作超级权限者的用户主目录。
/usr:
这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。
/usr/bin:
系统用户使用的应用程序。
/var:
这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
linux日志文件
/var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一
/var/log/secure 与安全相关的日志信息
/var/log/maillog 与邮件相关的日志信息
/var/log/cron 与定时任务相关的日志信息
/var/log/spooler 与UUCP和news设备相关的日志信息
/var/log/boot.log 守护进程启动和停止相关的日志消息
linux 布尔类型
linux没有布尔类型,可以转成字符再比较
first=true
# ...do something interesting...
if [ "$first" = true ] ; then
echo 'Be careful not to fall off!'
fi
if [ "first" = true ] 中=左右必须有空格,否则报错command is not found
重新设置变量
first=false
拼接字符串
greeting="hello, "first" !" greeting_1="hello,{first} !"
查找子字符串
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
string="runoob is a great site"
echo expr index "$string" io
# 输出 4
提取子字符串
从字符串第 2 个字符开始截取 4 个字符:
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
linux中 vi / vim显示行号或取消行号命令
显示行号
:set number
或者
:set nu
取消行号显示
:set nu!
每次打开都显示行号
修改vi ~/.vimrc 文件,添加:set number
参考:https://www.cnblogs.com/davidwang456/p/3895251.html
linux shell日期赋值给一个变量
d=(date +%Y-%m-%d) echo "d"
字符串查找
有个version.json文件,取出当前的版本号
{"prev":{"version":10080,"build_timestamp":1523500949,"value":"1523500949_10080"},"version":10081,"build_timestamp":1523504202,"value":"1523504202_10081"}
grep -Po ","version":(\d+)" .json -o | cut -d: -f2
或者用sed
echo '{"prev":{"version":10080,"build_timestamp":1523500949,"value":"1523500949_10080"},"version":10081,"build_timestamp":1523504202,"value":"1523504202_10081"}' | sed -n 's/."version":([0-9]+).*/\1/p'
grep 命令
-c 或 --count : 计算符合样式的列数。
-C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
-E 或 --extended-regexp : 将样式为延伸的普通表示法来使用。
-l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
-L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
-n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
-i 忽略字符大小写的差别。
-o 只输出文件中匹配到的部分。
-P perl正则表达式
在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:
grep test *file
cut 命令
Linux cut命令用于显示每行从开头算起 num1 到 num2 的文字。
语法
cut [-bn] [file]
cut [-c] [file]
cut [-df] [file]
使用说明:
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
参数:
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除
参考:https://stackoverflow.com/questions/8602848/grep-group-capturing