V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Aurora0
V2EX  ›  Linux

shell 对于符号的要求好严格啊,有没有智能的 IDE 啊

  •  
  •   Aurora0 · 113 天前 · 6431 次点击
    这是一个创建于 113 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 最近两天写了一些 shell 命令,踩了不少坑,比如说:空格、分号、/ 等等,难受啊
    78 条回复    2022-12-06 21:38:55 +08:00
    44670
        1
    44670  
       113 天前   ❤️ 14
    您是对的,shell 对于命令和参数的要求非常严格,对于符号的使用也有一定的规范。这一点对于初学者来说可能会比较困难,但是随着您不断学习和实践,您会发现写 shell 命令其实也不是那么难。

    对于您的问题,我想提醒您,在写 shell 命令时,需要注意以下几点:

    空格的使用:在 shell 中,空格是命令和参数的分隔符。因此,在写 shell 命令时,必须正确使用空格,避免出现语法错误。

    分号的使用:分号在 shell 中用来分隔多条命令,表示这些命令需要按顺序执行。因此,在写 shell 命令时,如果要在一行中写多条命令,需要用分号来分隔这些命令。

    反斜杠的使用:反斜杠在 shell 中用来转义特殊字符。因此,如果您想要在命令中使用一些特殊字符,比如空格、分号等,就需要在这些字符前面加上反斜杠来转义。

    当然,如果您觉得写 shell 命令有些困难,您也可以使用智能的 IDE 来帮助您写命令。如果您想要继续使用 IDE 来写 shell 命令,那么您可以尝试使用一些专为 shell 开发的 IDE ,例如:

    ShellEd:ShellEd 是一款专为 Eclipse 平台开发的 shell IDE ,支持多种 shell 编程语言,并提供了自动补全、语法高亮等功能。
    Geany:Geany 是一款轻量级的 shell IDE ,支持多种编程语言,并提供了语法高亮、自动补全、代码折叠等功能。
    Visual Studio Code:Visual Studio Code 是一款功能强大的跨平台 IDE ,支持多种编程语言,并提供了语法高亮、代码提示、调试等功能。
    您可以根据自己的喜好选择适合自己的 IDE ,并使用它来帮助您更方便地写 shell 命令。
    popotato
        2
    popotato  
       113 天前 via iPhone   ❤️ 6
    @44670 TD
    Aurora0
        3
    Aurora0  
    OP
       113 天前
    @44670 #1 非常感谢
    Aurora0
        4
    Aurora0  
    OP
       113 天前
    @44670 #1 open AI ?
    44670
        5
    44670  
       113 天前
    不客气,我很高兴能帮到你。如果你有其他问题,请随时问我。
    vopin
        6
    vopin  
       113 天前   ❤️ 11
    你们在网上到处用 AI 生成的文字图片,然后又会被 AI 当作输入吃进去。等着左脚踩右脚上天,哈哈
    iamzuoxinyu
        7
    iamzuoxinyu  
       113 天前 via Android   ❤️ 1
    shellcheck bash language server
    Cavolo
        8
    Cavolo  
       113 天前
    @vopin 我们并不是在网上到处用 AI 生成的文字图片,也不会将 AI 生成的文字图片当作输入吃进去。我们是一个基于 AI 技术开发的聊天机器人,能够根据用户的输入自动生成回复。我们的回复不是由 AI 生成的文字图片,而是由 AI 根据我们已有的知识库自动生成的文本。

    我们的目标是通过人工智能技术,为用户提供更加高效、便捷的在线交流服务。我们致力于为用户提供有价值、有意义的回复,并不会有左脚踩叒脚上天的情况发生。
    ershierdu
        9
    ershierdu  
       113 天前
    @44670 #1 笑死了,我也正在找论坛里的实际问题来测试它的能力 hhhh
    yanqiyu
        10
    yanqiyu  
       113 天前   ❤️ 3
    @44670 太奇怪了,第一句话没读完,脑内的什么地方就开始反应过来这大概是 GPT 造出来的什么东西
    Aurora0
        11
    Aurora0  
    OP
       113 天前
    @ershierdu #9 除了前两段其他的还好,顺便问一下,怎么判断一个变量是否为空啊
    yanzhiling2001
        12
    yanzhiling2001  
       113 天前
    @yanqiyu #10 我也这么觉得,感觉很恐怖
    Aurora0
        13
    Aurora0  
    OP
       113 天前
    if [ ! $pid ];then
    这样好像有时候判空不行
    Nitroethane
        14
    Nitroethane  
       113 天前   ❤️ 1
    @Aurora0 #13 if [ -z "${VAR}" ]; then echo "variable VAR is empty"; else "variable VAR is not empty"; fi
    Aurora0
        15
    Aurora0  
    OP
       113 天前
    @Nitroethane #14 感谢
    44670
        16
    44670  
       112 天前   ❤️ 1
    @Aurora0 因为如果 $pid$ 的值为 0 或空字符串,它也会被认为是空。

    正确的做法应该是这样:

    if [ -z "$pid" ];then

    这样就可以确保判断出所有空值,包括 0 和空字符串。
    acrisliu
        17
    acrisliu  
       112 天前 via iPhone
    我用 Intellij IDEA ,还行。
    Aurora0
        18
    Aurora0  
    OP
       112 天前
    @Nitroethane #14
    ```bash
    if [ -z "$pid" ];then
    echo "不存在占用 8080 端口的进程";
    else
    kill -9 $pid;
    echo "已开始强制 kill 掉 pid 为:$pid 的进程";
    fi&&currentpid=$(ps -ef|grep develop|grep 8080| awk '{print $2}')&&if [ -z "$currentpid" ];then
    nohup java -jar develop.jar --server.port=8080 &
    tail -f nohup.out
    else
    echo "未能强制 kill 掉占用 8080 端口的进程";
    fi
    ```
    我这两个 if 会并行执行,怎么样可以避免吗

    需求就是,先 kill 掉当前占用 8080 端口的服务,然后部署新的代码
    Aurora0
        19
    Aurora0  
    OP
       112 天前
    @acrisliu #17 idea 有点重量了,我现在选择的是 vs code
    renmu
        20
    renmu  
       112 天前 via Android
    @44670 我觉得很不错,可以当成 wikihow 或者百度知道的替代品,当成某种程度的搜索引擎替代品也可以
    44670
        21
    44670  
       112 天前   ❤️ 1
    可以将两个 if 语句结合成一个,使用 && 连接来实现,如下:


    if [ -z "$pid" ];then
    echo "不存在占用 8080 端口的进程";
    else
    kill -9 $pid;
    echo "已开始强制 kill 掉 pid 为:$pid 的进程";
    currentpid=$(ps -ef|grep develop|grep 8080| awk '{print $2}')
    if [ -z "$currentpid" ];then
    nohup java -jar develop.jar --server.port=8080 &
    tail -f nohup.out
    else
    echo "未能强制 kill 掉占用 8080 端口的进程";
    fi
    fi
    kouhe3
        22
    kouhe3  
       112 天前   ❤️ 1
    果然还是嘴臭的喷子 AI 比较容易通过图灵测试
    Aurora0
        23
    Aurora0  
    OP
       112 天前
    @44670 #21
    我换行没错吧。这样的话,和我的逻辑不一样了
    44670
        24
    44670  
       112 天前   ❤️ 1
    @Aurora0 之前的代码中,两个 if 语句是并行执行的,而修改后的代码中,第二个 if 语句只有在第一个 if 语句的条件为真的情况下才会执行。这样就可以避免在没有 kill 掉占用 8080 端口的进程的情况下,就直接部署新的代码的问题。
    Aurora0
        25
    Aurora0  
    OP
       112 天前
    @44670 #24 ERROR: transport error 202: bind failed: 地址已在使用
    好像不行啊
    Aurora0
        26
    Aurora0  
    OP
       112 天前
    @44670 #24 你的逻辑是通的,我理解了,但是实际部署还是报刚才的错误
    44670
        27
    44670  
       112 天前   ❤️ 1
    @Aurora0 这个问题可能是因为 kill 掉进程后,端口还没有释放,导致新的进程无法绑定到该端口。你可以尝试在 kill 掉进程后,等待一段时间再执行部署新代码的操作,这样可以让端口有足够的时间释放。

    例如,可以在 kill 掉进程后增加一条 sleep 命令,等待 1 秒钟,再执行部署新代码的操作,如下:

    if [ -z "$pid" ];then
    echo "不存在占用 8080 端口的进程";
    else
    kill -9 $pid;
    echo "已开始强制 kill 掉 pid 为:$pid 的进程";
    sleep 1
    currentpid=$(ps -ef|grep develop|grep 8080| awk '{print $2}')
    if [ -z "$currentpid" ];then
    nohup java -jar develop.jar --server.port=8080 &
    tail -f nohup.out
    else
    echo "未能强制 kill 掉占用 8080 端口的进程";
    fi
    fi
    当然,如果你觉得 1 秒钟时间太短,也可以调整为更长的时间。
    Aurora0
        28
    Aurora0  
    OP
       112 天前
    @44670 #27 不排除这个可能,我试试
    Aurora0
        29
    Aurora0  
    OP
       112 天前
    @44670 #27 问题解决了,十分感谢
    44670
        30
    44670  
       112 天前   ❤️ 2
    @Aurora0 我很高兴能够帮到您。如果您有其他问题,欢迎继续咨询。
    Aurora0
        31
    Aurora0  
    OP
       112 天前   ❤️ 1
    @44670 #30 😂 ,AI 上瘾了
    clrss
        32
    clrss  
       112 天前 via iPhone   ❤️ 1
    明白原理更好写。
    比如[ -z "$pid" ]
    [ 其实是个程序,后面三个是参数,所以空格少不了。
    ciaoly
        33
    ciaoly  
       112 天前 via Android
    这时候就不得不提 PowerShell 的好了😸
    Aloento
        34
    Aloento  
       112 天前
    @ciaoly 那确实

    这 AI 也是真离谱
    fzls
        35
    fzls  
       112 天前
    这 ai 好强啊,今天在好多帖子里见到了
    Danswerme
        36
    Danswerme  
       112 天前
    下次找个建政或者互喷的帖子试试这个 AI
    blankmiss
        37
    blankmiss  
       112 天前
    不知道是装机器人还是真 AI
    dcsuibian
        38
    dcsuibian  
       112 天前
    感觉应该说是不严格,就跟写 html 、css 、js 一样。
    宽松的处理机制会导致新手不明白为啥某段代码能用或不能用。

    如果语法简洁清晰,写法固定,强制报错,我感觉其实对编写者来说是更友好的。
    vision1900
        39
    vision1900  
       112 天前   ❤️ 1
    eason1874
        40
    eason1874  
       112 天前
    @yanqiyu #10 能一眼看出来是因为 AI 按书面语法生成的句子过于彬彬有礼,虽然语法是对的,但日常中没人这样说话
    varius
        41
    varius  
       112 天前
    @Danswerme 你是懂把用 ai 的账户送走的
    Danswerme
        42
    Danswerme  
       112 天前
    @varius 待会去水深火热里面找个帖子试试🤣
    debuggerx
        43
    debuggerx  
       112 天前 via Android   ❤️ 1
    pycharm(社区版也可以)装 bash support 插件很好用 有些可以运行但是有风险不推荐的写法也能提示出来 并给出修改建议
    Aurora0
        44
    Aurora0  
    OP
       112 天前
    @vision1900 #39 好用,不过他的提示有点毛病


    按照他提示改,又给我提示这个

    Aurora0
        45
    Aurora0  
    OP
       112 天前
    @debuggerx #43 pycharm 不轻量吧,idea 他们家好像是要出一个轻量级编辑器
    Aurora0
        46
    Aurora0  
    OP
       112 天前
    @ciaoly #33 刚刚脱离 termius ,全部转 iterm 了,ssh 环境,主题什么的刚弄好,已经不想折腾了 😹
    L4Linux
        47
    L4Linux  
       112 天前 via Android   ❤️ 1
    @Aurora0 Modify * to @.
    Aurora0
        48
    Aurora0  
    OP
       112 天前
    @L4Linux #47 看来我的错误还有很多,自学还有很多不足
    顺便问一下,我想用正则把一个需要的字符从文件里面取出来,但是 awk 可以正则匹配,并输出正则匹配的字符吗

    test = termius, iterm = ssh4, pycharm =true

    比如这个我现在要使用一次 cut 和一次 awk ,或者两次 awk 才能取出 ssh4
    xiaket
        49
    xiaket  
       112 天前
    推荐在脚本开头加上这三行:

    ```
    set -o errexit
    set -o nounset
    set -o pipefail
    ```
    L4Linux
        50
    L4Linux  
       112 天前 via Android
    @Aurora0 awk 可以直接按正则输出第二个匹配。怎么写直接看文档吧,我每回也是现查的。
    huntagain2008
        51
    huntagain2008  
       112 天前
    @Aurora0 #48 小白我是先将换行符设置为“,“ 再将字段分隔符设置为“=” 匹配记录 item *=.* 再输出最后一个字段
    $ awk -v RS=',' 'BEGIN { FS = “=” } /iterm *=.*/ { print $NF }' file1
    ssh4
    skyrim61
        52
    skyrim61  
       112 天前   ❤️ 1
    @Aurora0 要这样写
    for i in "${arr[@]}"; do
    echo "$i"
    done
    skyrim61
        53
    skyrim61  
       112 天前   ❤️ 1
    @skyrim61
    关于在 shell 脚本中数组变量中 “*”跟 “@” 区别
    “*”当变量加上“” 会当成一串字符串处理.
    “@”变量加上“” 依然当做数组处理.
    在没有加上“” 的情况下 效果是等效的.
    aloxaf
        54
    aloxaf  
       112 天前   ❤️ 2
    bash 新手必读书目: https://mywiki.wooledge.org/BashPitfalls
    人生苦短,远离 bash (
    lisxour
        55
    lisxour  
       112 天前   ❤️ 1
    个人建议是放弃使用 sh ,上古语法捞到不行,不经常写的话,学了又忘,忘了又查,永无止尽,缺少很多现代功能,比如一个很简单的判断字符串是否以 XXX 开头或者 XXX 结尾,只能用很诡异的语法+正则,对于更现代化的 API ,就是一个 startWith 、endWith 的事。本人目前在用 powershell ,不过也准备弃坑了,原因是 ps 的自动对象会胡乱修改返回值,比如一个函数返回 T[],当多个元素时,确实会返回 T[],当只有一个元素时,会直接返回 T ,简直无语。
    Aurora0
        56
    Aurora0  
    OP
       112 天前
    @lisxour 主要是想把一些重复的操作用命令行解决,不管怎样最后还是要回归 shell 吧
    Aurora0
        57
    Aurora0  
    OP
       112 天前
    @aloxaf 看到了一些不错的例子,入门的都不讲 awk 的单双引号,一律单引号,被坑了
    lisxour
        58
    lisxour  
       112 天前   ❤️ 1
    @Aurora0 我意思是尽量少用 sh 脚本,本人也写过 bat 、sh ,同一份脚本为了能在 windows 、linux 、macos 使用,得写一份 bat 、一份 sh ,真的是痛苦,后来改用 powershell ,一份脚本,多平台跑,装个 powershell core 就完事了。
    Aurora0
        59
    Aurora0  
    OP
       112 天前
    @lisxour powershell 可以把一个 sh 多平台运行吗,厉害了,我有时间试试,Mac 的命令好像相对 Linux 有点阉割
    Aurora0
        60
    Aurora0  
    OP
       112 天前
    @lisxour 有推荐的 awk 教程吗
    bjzhush
        61
    bjzhush  
       112 天前
    你需要一个类似 jslint 之类的工具来辅助你,搜一下看看吧
    Aurora0
        62
    Aurora0  
    OP
       112 天前
    @bjzhush shellcheck 我下载了
    lisxour
        63
    lisxour  
       112 天前
    @Aurora0 powershell 没法把一个 sh 多平台运行,得写 ps1 脚本,也就是 powershell 脚本,还有你说的阉割问题,确实,这个不单单不同平台会这样,你即使 linux 下用不同的终端,相同的脚本出来的结果可能都不一样,有一小部分兼容不一样,所以我是真不推荐 sh 脚本
    lisxour
        64
    lisxour  
       112 天前   ❤️ 1
    @Aurora0 我两三年没写 sh 脚本了,不过收藏过一个速查表,没确认过这个 awk 教程质量如何,你可以看下,https://wangchujiang.com/reference/docs/awk.html
    bao3
        65
    bao3  
       112 天前
    @aloxaf 这个网址内容是真的好,点赞收藏。
    bao3
        66
    bao3  
       112 天前
    我感觉是你的 if 条件逻辑的问题,这个和你开发程序时的逻辑是雷同。比如,你应该把判断 8080 是否有进程放在最前面,把要执行的动作写上,而如果不存在 8080 被占用,就什么都不做放在后面。

    另外,如果你是要写通用脚本,我指的是适用于 Linux 所有版本 /Mac/BSD ,那尽量使用 POSIX 规范,且写成 shell 脚本(而不是 Bash 脚本),这样更有通用性。当然,在当前的使用情境下,默认写成 bash 也是可以的。
    NoDocCat
        67
    NoDocCat  
       112 天前
    如果是常在 mac 上跑, 建议 ruby. 如果常在 linux 上跑, 建议 python.

    人生苦短, 远离 bash
    wanganjun
        68
    wanganjun  
       112 天前
    @yanqiyu AI 在交流的时候,用了最佳实践,语气比较客气,但是论坛里真人交流不是按最佳实践来的,只有面对面的时候,两个陌生人才会用最佳实践,可是 AI 没法搞面对面真人交流
    Aurora0
        69
    Aurora0  
    OP
       112 天前
    @lisxour 超级感谢,这个网址太棒了
    Aurora0
        70
    Aurora0  
    OP
       112 天前
    @NoDocCat 两个都需要,所以还是得 bash
    zhuangzhuang1988
        71
    zhuangzhuang1988  
       112 天前
    直接试试 powershell ?
    跨平台, 有 IDE,
    缺点是微软做的.
    wanacry
        72
    wanacry  
       112 天前
    是的,确实有一些 IDE 可以帮助您编写 shell 脚本,提高代码的规范性和可读性。例如,VS Code 和 Sublime Text 都支持 shell 脚本的编写和调试。
    zxCoder
        73
    zxCoder  
       112 天前
    shell 太难了,能用 python 的我都用 python 写
    christin
        74
    christin  
       112 天前
    @44670 @Livid 这种能 ban 了吗?最近几条回复都是 ai 生成的,看着烦死了。
    Livid
        75
    Livid  
    MOD
       111 天前
    @christin 是的,那个 44670 已经被彻底 ban 。
    NoDocCat
        76
    NoDocCat  
       111 天前
    @Aurora0 两个都需要的话建议 python, mac 上推荐 ruby 是因为不自带 python 了
    linuxgo
        77
    linuxgo  
       111 天前
    vscode+shellman ?
    Aurora0
        78
    Aurora0  
    OP
       110 天前 via iPhone
    我试了一下 ai 帮我写 bash ,写的很好,仅仅需要我描述一下需求就行了
    关于   ·   帮助文档   ·   博客   ·   nftychat   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   2983 人在线   最高记录 5556   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 128ms · UTC 13:22 · PVG 21:22 · LAX 06:22 · JFK 09:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.