Showing posts with label script. Show all posts
Showing posts with label script. Show all posts

Tuesday, February 9, 2021

[Bash Script] ข้อควรระวัง: ควรใช้ Full Path ของ Command ใน Bash Script
[Bash Script] Beware: Should Use Full Path of Command in Bash Script

เคสนี้เกิดขึ้นหลังจากที่เราเขียน bash script แล้วนำไปรันจริง ปรากฏว่า script นั้นสามารถรันบนเครื่อง UAT ได้ อย่างไม่มีปัญหาอะไร แต่เมื่อนำ script นั้นไปรันบนเครื่อง Production กลับไม่มีอะไรเกิดขึ้น 

สาเหตุที่พบ คือ การสั่งรัน command ใน script ที่เราเขียนนั้น เราเรียก command นั้นเลย โดยไม่ได้ใส่เป็น full path ของ command เอาไว้ มีความเป็นไปได้ว่า script อาจจะไม่สามารถหาที่อยู่ของ command นั้นได้

วิธีแก้ไข คือ เปลี่ยน command ที่ถูกเรียกใช้ใน script เป็น full path ทั้งหมด จึงทำให้ script นี้สามารถรันบนเครื่อง Production ได้ตามปกติ

คำแนะนำ เพื่อหลีกเลี่ยงจากเคสข้างบน เราแนะนำให้ใช้ full path ของ command ทั้งหมด ถ้าหากไม่ทราบ full path อาจจะใช้ which command ช่วย (สามารถอ่าน)

[Bash Script] วิธีการรันคำสั่งที่เก็บอยู่ในตัวแปร
[Bash Script] How to Run Command that Store in Variable

จากโพสต์ [Bash Script] วิธีการประกาศและใช้ตัวแปรใน Bash Script ที่เราสามารถเก็บค่าผลลัพธ์จากการรันคำสั่งอื่นๆใส่ในตัวแปรได้

สมมติว่า เรามีตัวแปร ชื่อ command ที่เก็บค่าดังนี้

command=$(which echo)

ในที่นี้ command จะมีค่าเป็น /bin/echo

ถ้าหากเราต้องการนำค่าของ command ไปเป็นคำสั่งในการรันต่อ เราจะใช้คำสั่งดังนี้

$command "echo_string"

เราจะเห็นได้ว่า command จะมี $ นำหน้า เพื่อแทนที่ตัวแปรนั้นด้วยค่าของมัน แล้วตามด้วย parameter ที่จะส่งเข้าไปยังคำสั่งนั้นๆ ซึ่งบรรทัดข้างบนจะมีค่าเท่ากับ

/bin/echo "echo_string"

Monday, April 27, 2020

[Bash Script] ระวังการสร้าง ฺBash Script บน Windows แล้วอาจจะไม่สามารถนำมารันบน Unix ได้
[Bash Script] Warning: Create Bash Script on Windows then Cannot Run on Unix

ในกรณีนี้เราเขียน Bash script ขึ้นมาบน Windows แล้วค่อยอัพโหลดขึ้นไปรันบนเซิร์ฟเวอร์ที่เป็น Ubuntu ผลการรันได้ข้อผิดพลาดตามด้านล่างนี้
/bin/bash^M: bad interpreter: No such file or directory
สาเหตุเกิดจากอักขระที่แทนการขึ้นบรรทัดใหม่บน Windows และ Unix นั้นต่างกันดังนี้
  • Windows จะเป็น \r\n
  • Unix จะเป็น \n
ทำให้ \r เป็นอักขระที่ไม่เกี่ยวข้องกับการขึ้นบรรทัดใหม่ จึงถูกมองว่าเป็นอักขระอีกตัวที่ตามหลัง /bin/bash จึงเกิดข้อผิดพลาดข้างต้น

วิธีแก้ไข คือ รันคำสั่งดังนี้
sed -i -e 's/\r$//' scriptname.sh
หรือเขียน bash script ใหม่บน Unix แทน

Wednesday, April 22, 2020

[Bash Script] วิธีการพิมพ์ข้อความที่มีการขึ้นบรรทัดใหม่หรือ Backslash Escape บน Bash
[Bash Script] How to Print New Line or Backslash Escape on Bash

เวลาเราจะพิมพ์ข้อความออกทาง standard output เราจะใช้คำสั่ง echo ดังนี้
echo "your_message"
นอกจากนั้น เรายังนำคำสั่งข้างต้นมาประยุกต์ใช้ เพื่อพิมพ์ข้อความลงไปในไฟล์ดังนี้
echo "your_message" >> [filename]
หากเราต้องการพิมพ์ข้อความที่มีการขึ้นบรรทัดใหม่หรือมี Backslash Escape แทรกอยู่ลงไปในไฟล์ ให้เราเลือกใช้คำสั่งใดคำสั่งหนึ่งต่อไปนี้
  • ใช้คำสั่ง printf แทน echo
    printf "your_message1\nyour_message2"
    
  • ใช้คำสั่ง echo ตามด้วย option -e เพื่ออนุญาตให้แปลง backslash escape
    echo -e "your_message1\nyour_message2"
    
  • ใช้คำสั่ง echo ตามด้วย $'your_message' เพื่อบอกว่า your_message เป็น ANSI-C Quoting
    echo $'your_message1\nyour_message2'
    

Wednesday, April 1, 2020

[Bash Script] วิธีการใช้วันที่และเวลาสำหรับชื่อไฟล์ในไฟล์ Bash
[Bash Script] How to Use Date and Time for Filename in Bash File

สำหรับค่าของวันที่และเวลาจะอยู่ในตัวแปรชื่อ date ซึ่งเราสามารถเรียกใช้ตามตัวอย่างดังนี้
echo `date`  # Wed Apr 1 06:22:11 UTC 2020
ในการจัดรูปแบบของวันที่และเวลา เราจะใช้คำสั่งในดังต่อไปนี้
echo `date +<format-option><format-option>...`
ยกตัวอย่างเช่น
echo `date +%Y%m%d`  # 20200401
กรณีที่เราต้องการตั้งชื่อไฟล์ โดยมีวันที่และเวลาในรูปแบบ yyyymmdd_hhmmss อยู่ในชื่อไฟล์ด้วย เราสามารถใช้คำสั่งดังนี้
filename=test_`date +%Y%m%d_%H%M%S`.zip
echo $filename
หมายเหตุ format-option สามารถอ่านเพิ่มเติมได้ที่ Bash Date – Format Options and Examples

Thursday, March 19, 2020

[Bash Script] รู้หรือไม่ว่า ส่วนหัวของ Bash Script ที่เป็นเครื่องหมาย #! มีไว้ใช้ทำอะไร
[Bash Script] What does the Head of a Script (#! Line) do?

เครื่องหมาย #! (she-bang) ในส่วนของหัว script ใช้เพื่อระบุว่า กลุ่มของคำสั่งในไฟล์นี้ต้องใช้  command interpreter ตัวใด

ส่วนข้อความหลังเครื่องหมาย #! คือ path ของโปรแกรมที่ใช้ประมวลผลคำสั่งใน script ซึ่งอาจะเป็น shell, programming language หรือโปรแกรมอื่นๆ

command interpreter นี้จะเริ่มประมวลผลคำสั่งใน script เริ่มต้นจากบรรทัดใต้เครื่องหมาย #! เป็นต้นไปและข้ามบรรทัดที่เป็น comment

ตัวอย่างของบรรทัดที่เป็น she-bang เป็นดังนี้

#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/bin/awk -f

หมายเหตุ โดยปกติแล้ว จะใช้ #!/bin/sh และ #!/bin/bash เป็นหลัก

Thursday, February 20, 2020

[Bash Script] การสร้าง Link ระหว่าง File หรือ Folder
[Bash Script] How to Create Link between File or Folder

การสร้าง link file หรือ folder จะช่วยเพิ่มความสะดวกในการใช้งาน

สมมติว่า เราต้องเข้าไปที่ folder /usr/share/nginx/myweb ทุกครั้ง เพื่อแก้ไขหน้าเว็บ

เราสามารถสร้าง link /usr/share/nginx/myweb มาที่ folder /app

หลังจากนั้น หากเราต้องการแก้ไขหน้าเว็บ สามารถเข้าไปที่ /app/myweb ได้เลย

คำสั่งสำหรับสร้าง link file เป็นดังนี้
ln source_file destination_folder
เช่น
ln /usr/share/nginx/myscript.sh ~/app/

Friday, December 6, 2019

[Bash Script] วิธีการใช้ Environment Variables จากไฟล์ .env ใน Bash Script
[Bash Script] How to Use Environment Variables from .env File in Bash Script

สมมติว่า Bash script ที่เราจะกำลังเขียนใหม่อยู่ใน folder เดียวกับไฟล์ .env และไฟล์ .env มีข้อมูลดังนี้
DOMAIN="code2now.com"
เราสามารถเขียน script ของเรา เพื่อใช้งานข้อมูลในไฟล์ .env ดังนี้
# Set allexport option 
set -a
. ./.env
set +a

echo $DOMAIN
คำอธิบายเพิ่มเติม

set -a และ set +a เป็นการเปิดและปิด feature ที่ทำให้ตัวแปรที่ถูกประกาศระหว่าง 2 บรรทัดนี้ ถูก export เป็น environment variable

. ./.env เป็นการโหลด source จากไฟล์ .env

echo $DOMAIN เป็นตัวอย่างการใช้งาน environment variable จากไฟล์ .env

Tuesday, October 29, 2019

[Batch Script] วิธีการ Disable การเปลี่ยนภาพพื้นหลังหน้าจอ
[Batch Script] How to Disable Changing Desktop Background

กรณีที่เราต้องการตั้งค่าการเปลี่ยนภาพพื้นหลังหน้าจอผ่าน Batch Script เราจำเป็นต้องเปลี่ยนค่าของ Registry แทนการตั้งค่าผ่าน UI

ขั้นแรก เราต้องหาให้ได้ว่า Registry ตัวใดที่ควบคุมการตั้งค่าการเปลี่ยนภาพพื้นหลัง ซึ่งสามารถหาได้จากลิ้งค์ข้างล่างนี้
How to stop people from changing your Windows 10 desktop wallpaper

ขั้นต่อไป เราต้องเขียน Batch Script ที่มีคำสั่งตามด้านล่างนี้ เพื่อเพิ่ม Key และ Value ของ Registry ข้างต้น
REG ADD HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\ActiveDesktop /f /v NoChangingWallPaper /t REG_DWORD /d 1
สามารถอ่านเพิ่มเติมได้ที่ Batch Script - Adding to the Registry

กรณีที่เราต้องการลบการตั้งค่าข้างต้น เราสามารถรันคำสั่งตามด้านล่างนี้ใน PowerShell
REG DELETE HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\ActiveDesktop /f /v NoChangingWallPaper
สามารถอ่านเพิ่มเติมได้ที่ Batch Script - Deleting from the Registry

Friday, June 28, 2019

[Docker] วิธีการใช้ Git Tag เป็น Version ของ Code ใน Docker Image
[Docker] How to Use Git Tag as Version of Code in Docker Image

ในกรณีที่เราต้องการใช้ GIT Tag เพื่อแสดงเป็น Version บนหน้าเว็บ มีวิธีทำดังนี้

ขั้นแรก แก้ไข Dockerfile โดยเพิ่มบรรทัดตามด้านล่างนี้
ARG GIT_TAG=12345
ARG MAIN_FILE
RUN sed -i -e "s/version:\"0\.0\.0\"/version:\"${GIT_TAG}\"/" public/$MAIN_FILE
  • บรรทัดแรก เป็นการประกาศว่า เราจะรับตัวแปรชื่อ GIT_TAG ที่จะถูกส่งเข้ามาทาง build argument ตอนสั่ง docker build ซึ่งถ้าไม่มีค่าอะไรส่งเข้ามาเลย ให้ตั้งค่าตั้งต้นเป็น 12345
  • บรรทัดที่สอง เป็นการประกาศว่า เราจะรับตัวแปรชื่อ MAIN_FILE ที่จะถูกส่งเข้ามาทาง build argument
  • บรรทัดที่สุดท้าย เป็นการรันคำสั่งเพื่อ replace ค่า 0.0.0 ในไฟล์ MAIN_FILE ด้วยค่าของ GIT_TAG

[Bash Script] วิธีการประกาศและใช้ตัวแปรใน Bash Script
[Bash Script] How to Declare and Use Variable in Bash Script

สำหรับการประกาศตัวแปรพร้อม assign ค่า ให้ใช้รูปแบบดังนี้
VARIABLE_NAME=VALUE
หมายเหตุ: ไม่มีช่องว่างข้างหน้าและข้างหลังเครื่องหมายเท่ากับ (=)

สำหรับการเรียกใช้ค่าตัวแปร ให้ใช้รูปแบบดังนี้
echo $VARIABLE_NAME;
หมายเหตุ: มี $ นำหน้าชื่อตัวแปร

สำหรับการ assign ค่าที่ได้จากการรันคำสั่งอื่นๆ ให้ใช้รูปแบบดังนี้
VARIABLE_NAME=$(COMMAND)
หมายเหตุ:  คำสั่งที่รันอยู่ภายใน $(...) ตัวอย่างเช่น
VERSION=1.0.0
MAIN_FILE=$(grep -o 'main.[0-9a-z]*.js' public/index.html)
sed -i -e "s/version:\"0\.0\.0\"/version:\"$VERSION\"/" public/$MAIN_FILE

Monday, June 24, 2019

[Bash Script] วิธีการหาส่วนของข้อความที่อยู่ภายในไฟล์ข้อความ โดยใช้ Regular Expression
[Bash Script] How to Find Substring within Text File by Using Regular Expression

คุณสามารถใช้คำสั่ง grep ตามด้านล่างนี้
grep -o 'Regex pattern' filename
ตัวอย่างเช่น
grep -o 'main.[0-9a-z]*.js' public/index.html
ในกรณีนี้ index.html เป็นไฟล์ที่ถูกสร้างโดย AngularJS และมีชื่อไฟล์ main.{hash}.js อยู่ภายในไฟล์

เราไม่สามารถรู้ค่า hash ของชื่อไฟล์นี้ได้ แต่เรารู้รูปแบบข้อความของชื่อไฟล์นี้

ดังนั้นเราสามารถใช้ Regular Expression ในการหาชื่อไฟล์นี้จาก index.js ได้

Friday, November 29, 2013

[Batch Script] ความแตกต่างระหว่างคำสั่ง CALL และ START
[Batch Script] What Difference between CALL and START commands

CALL เป็นวิธีการเรียกไฟล์ batch อื่น (ไฟล์ batch ที่ถูกเรียก) ภายในไฟล์ batch ที่รันอยู่ (ไฟล์ batch ที่เรียก) แล้วกลับมายังไฟล์ batch ที่เรียก โดยไม่ยกเลิกการประมวลผลของไฟล์ที่เรียก และมีการใช้สภาพแวดล้อมเดียวกันสำหรับไฟล์ batch ที่เรียกและไฟล์ batch ที่ถูกเรียก
CALL is the way to call another batch file within a batch file and return to the caller without aborting the execution of the calling batch file, and using the same environment for both batch files.

START เป็นวิธีการเริ่มโปรแกรมในหน้าต่าง cmd.exe ใหม่ ดังนั้นมันสามารถรันไฟล์ batch ที่ถูกเรียกได้พร้อมกัน
START is the way to start a program in a new cmd.exe instance, so it can run a called batch file asynchronosly

[Batch Script] วิธีการเปิดเบราว์เซอร์ Chrome ด้วยตำแหน่งที่ต่างกัน
[Batch Script] How to Open Chrome Browsers with Difference Position

สมมติว่า ;C:\Program Files (x86)\Google\Chrome\Application ถูกเพิ่มไปยังพาธของระบบ
Suppose that ;C:\Program Files (x86)\Google\Chrome\Application is added to system path

สำหรับการเปิดเบราว์เซอร์ Chrome 2 เบราว์เซอร์ด้วยตำแหน่งที่ต่างกัน ลองสคริปต์ด้านล่าง
For opening two Chrome browsers with difference position, try below script
start chrome --window-position=100,100 --new-window
start chrome --window-position=400,400 --new-window

หมายเหตุ: ปิดเบราว์เซอร์ Chrome ทั้งหมดก่อนรันสคริปต์นี้
Notice: Close all Chrome browsers before running this batch script

Monday, November 4, 2013

[Batch Script] วิธีรันไฟล์แบทช์ทั้งหมดภายในแฟ้มที่กำหนด
[Batch Script] How to Run All Batch Files within Specific Folder

ถ้าคุณมีไฟล์แบทช์มากมาย คุณไม่จำเป็นต้องรวมมันมาไว้ในไฟล์เดียวเพื่อรัน
If you have many batch files, you are not necessary to merge them into one file

สคริปต์แบทช์เป็นตามด้านล่าง
Batch script is below
  1. @echo off
  2. FOR %%x IN ("path_batch_folder\*.bat") DO call "%%x"

โดยที่ path_batch_folder คือ ตำแหน่งของแฟ้มที่เก็บไฟล์แบทช์
where path_batch_folder is a path of  folder of batch files

Tuesday, October 29, 2013

[Batch Script] คำสั่งและตัวเลือกสำหรับบราวเซอร์ Chrome
[Batch Script] Chrome Browser Command Line

สมมติว่า ;C:\Program Files (x86)\Google\Chrome\Application ถูกเพิ่มไปยัง system path (ตาม วิธีการเพิ่มค่าใหม่ใน System Path)
Suppose that ;C:\Program Files (x86)\Google\Chrome\Application is added to system path (follow How to Add New Values to System Path)

เพื่อเปิดบราวเซอร์ Chrome ใช้คำสั่ง
To open Chrome browser, use command
start chrome

เพื่อเปิด URL ที่ต้องการด้วยบราวเซอร์ Chrome ใช้คำสั่ง
To open Chrome browser with specified URL, use command
start chrome "url"

[Batch Script] วิธีการหาพาธของแฟ้มของไฟล์ Batch ที่กำลังประมวลผล
[Batch Script] How to Get Directory Path of Executing Batch File

เพื่อเข้าไปยังแฟ้มของไฟล์ batch ที่กำลังประมวลผล ใช้คำสั่ง
To get into directory path of executing batch file, use command
cd /d %~dp0

Wednesday, June 12, 2013

[Batch Script] FOR Syntax

syntax-FOR-Files
       FOR %%parameter IN (set) DO command

syntax-FOR-Folders
       FOR /D %%parameter IN (folder_set) DO command
 
 syntax-FOR-List of numbers  
       FOR /L %%parameter IN (start,step,end) DO command

[Batch Script] วิธีเปลี่ยนค่าตัวแปรในลูป FOR
[Batch Script] How to Change Variable in FOR Loop

เนื่องจากลูป FOR ถูก interpret ตัวแปรในลูป FOR จึงไม่สามารถเปลี่ยนค่าและใช้ค่าที่ถูกเปลี่ยนในลูปเดียวกันได้
Due to FOR loop is interpreted, we cannot change a variable within a FOR loop and use that changed variable in the same loop

เราจึงต้องใช้ Delayed variable expansion ดังนั้นใส่คำสั่งนี้ก่อนลูป FOR
Delayed variable expansion is needed so add this command before FOR loop 
setlocal enabledelayedexpansion

แล้วใส่คำสั่งนี้ใต้ลูป FOR
Then add this command below FOR loop
endlocal 

[Batch Script] เปลี่ยนชื่อไฟล์ทั้งหมดในแฟ้ม
[Batch Script] Rename All Files in Folder

  1. @echo off
  2. set OpList=%TEMP%\%RANDOM%.bat
  3. copy nul "%OpList%"
  4. set /a num=1
  5. setlocal enabledelayedexpansion
  6. for %%F in (%1\*) do (     
  7.      echo ren "%%F" "%2!num!.jpg" >> "%OpList%"
  8.      set /a num=num+1
  9. )
  10. endlocal
  11. call "%OpList%"
  12. del "%OpList%"
  13. pause