IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> shell使用详解,看了这篇文章我才真正理解了 -> 正文阅读

[大数据]shell使用详解,看了这篇文章我才真正理解了

END

Embedded newlines are ok too

long_string="I am an exceptionally

long string."

管道

如果一行容不下整个管道操作,那么请将整个管道操作分割成每行一个管段。

如果一行容得下整个管道操作,那么请将整个管道操作写在同一行。

否则,应该将整个管道操作分割成每行一个管段,管道操作的下一部分应该将管道符放在新行并且缩进2个空格。这适用于使用管道符’|’的合并命令链以及使用’||’和’&&’的逻辑运算链。

All fits on one line

command1 | command2

Long commands

command1 \

| command2 \

| command3 \

| command4

循环

请将 ; do , ; then 和 while , for , if 放在同一行。

shell中的循环略有不同,但是我们遵循跟声明函数时的大括号相同的原则。也就是说, ; do , ; then 应该和 if/for/while 放在同一行。 else 应该单独一行,结束语句应该单独一行并且跟开始语句垂直对齐。

例如:

for dir in ${dirs_to_cleanup}; do

if [[ -d “ d i r / {dir}/ dir/{ORACLE_SID}” ]]; then

log_date “Cleaning up old files in d i r / {dir}/ dir/{ORACLE_SID}”

rm “ d i r / {dir}/ dir/{ORACLE_SID}/”*

if [[ “$?” -ne 0 ]]; then

error_message

fi

else

mkdir -p “ d i r / {dir}/ dir/{ORACLE_SID}”

if [[ “$?” -ne 0 ]]; then

error_message

fi

fi

done

case语句

通过2个空格缩进可选项。

在同一行可选项的模式右圆括号之后和结束符 ;; 之前各需要一个空格。

长可选项或者多命令可选项应该被拆分成多行,模式、操作和结束符 ;; 在不同的行。

匹配表达式比 case 和 esac 缩进一级。多行操作要再缩进一级。一般情况下,不需要引用匹配表达式。模式表达式前面不应该出现左括号。避免使用 ;& 和 ;;& 符号。

case “${expression}” in

a)

variable="…"

some_command “ v a r i a b l e " " {variable}" " variable""{other_expr}” …

;;

absolute)

actions=“relative”

another_command “ a c t i o n s " " {actions}" " actions""{other_expr}” …

;;

*)

error “Unexpected expression ‘${expression}’”

;;

esac

只要整个表达式可读,简单的命令可以跟模式和 ;; 写在同一行。这通常适用于单字母选项的处理。当单行容不下操作时,请将模式单独放一行,然后是操作,最后结束符 ;; 也单独一行。当操作在同一行时,模式的右括号之后和结束符 ;; 之前请使用一个空格分隔。

verbose=‘false’

aflag=’’

bflag=’’

files=’’

while getopts ‘abf:v’ flag; do

case “${flag}” in

a) aflag=‘true’ ;;

b) bflag=‘true’ ;;

f) files="${OPTARG}" ;;

v) verbose=‘true’ ;;

*) error “Unexpected option ${flag}” ;;

esac

done

变量扩展

按优先级顺序:保持跟你所发现的一致;引用你的变量;推荐用 ${var} 而不是 $var ,详细解释如下。

这些仅仅是指南,因为作为强制规定似乎饱受争议。

以下按照优先顺序列出。

与现存代码中你所发现的保持一致。

引用变量参阅下面一节,引用。

除非绝对必要或者为了避免深深的困惑,否则不要用大括号将单个字符的shell特殊变量或定位变量括起来。推荐将其他所有变量用大括号括起来。

Section of recommended cases.

Preferred style for ‘special’ variables:

echo “Positional: $1” “$5” “$3”

echo “Specials: != ! , ? = !, -= !,?=-, _= . ? = _. ?= .??=?, #=KaTeX parse error: Expected 'EOF', got '#' at position 1: #? *=* @=$@ $=$$ …”

Braces necessary:

echo “many parameters: ${10}”

Braces avoiding confusion:

Output is “a0b0c0”

set – a b c

echo “ 10 {1}0 10{2}0${3}0”

Preferred style for other variables:

echo “PATH= P A T H , P W D = {PATH}, PWD= PATH,PWD={PWD}, mine=${some_var}”

while read f; do

echo “file=${f}”

done < <(ls -l /tmp)

Section of discouraged cases

Unquoted vars, unbraced vars, brace-quoted single letter

shell specials.

echo a= a v a r " b = avar "b= avar"b=bvar" “PID=KaTeX parse error: Expected '}', got 'EOF' at end of input: {}” “${1}”

Confusing use: this is expanded as “ 10 {1}0 10{2}0${3}0”,

not " 10 {10} 10{20}${30}

set – a b c

echo “$10$20$30”

引用

除非需要小心不带引用的扩展,否则总是引用包含变量、命令替换符、空格或shell元字符的字符串。

推荐引用是单词的字符串(而不是命令选项或者路径名)。

千万不要引用整数。

注意 [[ 中模式匹配的引用规则。

请使用 $@ 除非你有特殊原因需要使用 $* 。

‘Single’ quotes indicate that no substitution is desired.

“Double” quotes indicate that substitution is required/tolerated.

Simple examples

“quote command substitutions”

flag=" ( s o m e c o m m a n d a n d i t s a r g s " (some_command and its args " (somec?ommandanditsargs"@" ‘quoted separately’)"

“quote variables”

echo “${flag}”

“never quote literal integers”

value=32

“quote command substitutions”, even when you expect integers

number="$(generate_number)"

“prefer quoting words”, not compulsory

readonly USE_INTEGER=‘true’

“quote shell meta characters”

echo ‘Hello stranger, and well met. Earn lots of $$$’

echo “Process $$: Done making $$$.”

“command options or path names”

($1 is assumed to contain a value here)

grep -li Hugo /dev/null “$1”

Less simple examples

“quote variables, unless proven false”: ccs might be empty

git send-email --to “${reviewers}” KaTeX parse error: Expected '}', got 'EOF' at end of input: {ccs:+"--cc" "{ccs}"}

Positional parameter precautions: $1 might be unset

Single quotes leave regex as-is.

grep -cP ‘([Ss]pecial||?characters*)$’ ${1:+"$1"}

For passing on arguments,

“$@” is right almost everytime, and

$* is wrong almost everytime:

* $* and $@ will split on spaces, clobbering up arguments

that contain spaces and dropping empty strings;

* “$@” will retain arguments as-is, so no args

provided will result in no args being passed on;

This is in most cases what you want to use for passing

on arguments.

* “$*” expands to one argument, with all args joined

by (usually) spaces,

so no args provided will result in one empty string

being passed on.

(Consult ‘man bash’ for the nit-grits 😉

set – 1 “2 two” “3 three tres”; echo KaTeX parse error: Expected 'EOF', got '#' at position 1: #? ; set -- "*"; echo “$#, $@”)

set – 1 “2 two” “3 three tres”; echo KaTeX parse error: Expected 'EOF', got '#' at position 1: #? ; set -- "@"; echo “$#, $@”)

特性及错误


命令替换

使用 $(command) 而不是反引号。

嵌套的反引号要求用反斜杠转义内部的反引号。而 $(command) 形式嵌套时不需要改变,而且更易于阅读。

例如:

This is preferred:

var=" ( c o m m a n d " (command " (command"(command1)")"

This is not:

var=“command \command1``”

test,[和[[

推荐使用 [[ … ]] ,而不是 [ , test , 和 /usr/bin/ [ 。

因为在 [[ 和 ]] 之间不会有路径名称扩展或单词分割发生,所以使用 [[ … ]] 能够减少错误。而且 [[ … ]] 允许正则表达式匹配,而 [ … ] 不允许。

This ensures the string on the left is made up of characters in the

alnum character class followed by the string name.

Note that the RHS should not be quoted here.

For the gory details, see

E14 at http://tiswww.case.edu/php/chet/bash/FAQ

if [[ “filename” =~ 1+name ]]; then

echo “Match”

fi

This matches the exact pattern “f*” (Does not match in this case)

if [[ “filename” == “f*” ]]; then

echo “Match”

fi

This gives a “too many arguments” error as f* is expanded to the

contents of the current directory

if [ “filename” == f* ]; then

echo “Match”

fi

测试字符串

尽可能使用引用,而不是过滤字符串。

Bash足以在测试中处理空字符串。所以,请使用空(非空)字符串测试,而不是过滤字符,使得代码更易于阅读。

Do this:

if [[ “${my_var}” = “some_string” ]]; then

do_something

fi

-z (string length is zero) and -n (string length is not zero) are

preferred over testing for an empty string

if [[ -z “${my_var}” ]]; then

do_something

fi

This is OK (ensure quotes on the empty side), but not preferred:

if [[ “${my_var}” = “” ]]; then

do_something

fi

Not this:

if [[ “${my_var}X” = “some_stringX” ]]; then

do_something

fi

为了避免对你测试的目的产生困惑,请明确使用-z或者-n

Use this

if [[ -n “${my_var}” ]]; then

do_something

fi

Instead of this as errors can occur if ${my_var} expands to a test

flag

if [[ “${my_var}” ]]; then

do_something

fi

文件名的通配符扩展

当进行文件名的通配符扩展时,请使用明确的路径。

因为文件名可能以 - 开头,所以使用扩展通配符 ./* 比 * 来得安全得多。

Here’s the contents of the directory:

-f -r somedir somefile

This deletes almost everything in the directory by force

psa@bilby$ rm -v *

removed directory: `somedir’

removed `somefile’

As opposed to:

psa@bilby$ rm -v ./*

removed `./-f’

removed `./-r’

rm: cannot remove `./somedir’: Is a directory

removed `./somefile’

Eval

应该避免使用eval。

当用于给变量赋值时,Eval解析输入,并且能够设置变量,但无法检查这些变量是什么。

What does this set?

Did it succeed? In part or whole?

eval $(set_my_variables)

What happens if one of the returned values has a space in it?

variable="$(eval some_function)"

管道导向while循环

请使用过程替换或者for循环,而不是管道导向while循环。在while循环中被修改的变量是不能传递给父shell的,因为循环命令是在一个子shell中运行的。

管道导向while循环中的隐式子shell使得追踪bug变得很困难。

last_line=‘NULL’

your_command | while read line; do

last_line="${line}"

done

This will output ‘NULL’

echo “${last_line}”

如果你确定输入中不包含空格或者特殊符号(通常意味着不是用户输入的),那么可以使用一个for循环。

total=0

Only do this if there are no spaces in return values.

for value in $(command); do

total+="${value}"

done

使用过程替换允许重定向输出,但是请将命令放入一个显式的子shell中,而不是bash为while循环创建的隐式子shell。

total=0

last_file=

while read count filename; do

total+="${count}"

last_file="${filename}"

done < <(your_command | uniq -c)

This will output the second field of the last line of output from

the command.

echo “Total = ${total}”

echo “Last one = ${last_file}”

当不需要传递复杂的结果给父shell时可以使用while循环。这通常需要一些更复杂的“解析”。请注意简单的例子使用如awk这类工具可能更容易完成。当你特别不希望改变父shell的范围变量时这可能也是有用的。

Trivial implementation of awk expression:

awk ‘$3 == “nfs” { print $2 " maps to " $1 }’ /proc/mounts

cat /proc/mounts | while read src dest type opts rest; do

if [[ ${type} == “nfs” ]]; then

echo “NFS ${dest} maps to ${src}”

fi

done

总结

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的?点击我的GitHub免费获取。
还有免费的高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。

2 " maps to " $1 }’ /proc/mounts

cat /proc/mounts | while read src dest type opts rest; do

if [[ ${type} == “nfs” ]]; then

echo “NFS ${dest} maps to ${src}”

fi

done

总结

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的?点击我的GitHub免费获取。
还有免费的高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。

跨平台开发:Flutter.png


  1. [:alnum:] ??

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-19 01:14:20  更:2022-02-19 01:15:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:11:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码